【问题标题】:How to add new dict to list of dict with SQLAlchemy如何使用 SQLAlchemy 将新字典添加到字典列表中
【发布时间】:2022-01-11 08:38:30
【问题描述】:

假设这是一个示例 json。

{
  "id": 1,
  "details": [
    {
      "a": "100",
    }
  ]
}

我想要的结果是将{'b': '200'} 添加到详细信息中,它将如下所示。

{
  "id": 1,
  "details": [
    {
      "a": "100",
    },
    {
      "b": "200",
    },
  ]
}

在我的文件里,我试了很多次,还是不行那么,如何用sqlalchemy添加dict

class Models(Base):
    __tablename__ = 'Table'
    id = Column(Integer, primary_key=True)
    details = Column(JSONB, nullable=False, server_default='[]')


@router.post("/post2")
async def post2(id: int = 1):
    session = Session()
    user = session.query(Models).filter(
        Models.id == id).first()
    for var in user.details:
        var.append({"b": "200"})
    session.commit()
    return user

【问题讨论】:

标签: python sqlalchemy fastapi


【解决方案1】:

你可能需要使用flag_modified,因为你不能直接更新JSONB:

from sqlalchemy.orm.attributes import flag_modified

@router.post("/post2")
async def post2(id: int = 1):
    session = Session()
    user = session.query(Models).filter(
        Models.id == id
    ).first()
    
    user.details.append({"b": "200"})
    flag_modified(user, "details")    
    session.commit()
    return user

或重写整个集合:

import copy

@router.post("/post2")
async def post2(id: int = 1):
    session = Session()
    user = session.query(Models).filter(
        Models.id == id
    ).first()
    
    details = copy.deepcopy(user.details)
    details.append({"b": "200"})
    user.details = details   
    session.commit()
    return user

这里是类似的话题:Updates to JSON field don't persist to DB

【讨论】:

  • 谢谢,根据您的建议,我应该使用哪个 flag_modified 或 copy.deepcopy?
  • 如果你修改你的字典的很大一部分,我会使用 deepcopy 重写结构。但是当你只添加一个键时,flag_modified 看起来更合适。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多