如何使用 SQLAlchemy 将新字典添加到字典列表中
Posted
技术标签:
【中文标题】如何使用 SQLAlchemy 将新字典添加到字典列表中【英文标题】:How to add new dict to list of dict with 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
【问题讨论】:
你需要突变追踪:***.com/a/56536752/2681632 【参考方案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 看起来更合适。以上是关于如何使用 SQLAlchemy 将新字典添加到字典列表中的主要内容,如果未能解决你的问题,请参考以下文章