对JSON字段的更新不会持久到DB

2024-04-23 16:13:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个带有JSON字段的模型,其中插入了用户标志。插入确实如预期的那样工作,但是当删除某些标志时,它们将保留在字段中,并且更改不会持久化到数据库。

我们的模型中有以下方法:

def del_flag(self, key):
    if self.user_flags is None or not key in self.user_flags:
        return False
    else:
        del self.user_flags[key]
        db.session.commit()        
        return True

数据库是postgres,我们使用SQLalchemy JSON字段方言作为字段类型。有什么建议吗?


Tags: 方法key用户模型self数据库jsonreturn
3条回答

如果使用Postgres<;9.4,则不能直接更新JSON字段。您需要flag\u modified函数将更改报告给SQLAlchemy:

from sqlalchemy.orm.attributes import flag_modified
model.data['key'] = 'New value'
flag_modified(model, "data")
session.add(model)
session.commit()

我的问题是在创建新行时引用从SQLAlchemy返回的行对象。e、 g.此功能不起作用:

row = db.session.query(SomeTable).filter_by(id=someId).first()
print(row.details)
newDetails = row.details
newDetails['key'] = 'new data'
row.details = newDetails
db.session.commit()

但是创建一个新的dict确实有效

row = db.session.query(SomeTable).filter_by(id=someId).first()
print(row.details)
newDetails = dict(row.details)
newDetails['key'] = 'new data'
row.details = newDetails
db.session.commit()

注意dict(row.details)

我使用的是JSON字段,我引用了下面的文档。

https://docs.sqlalchemy.org/en/13/core/type_basics.html?highlight=json#sqlalchemy.types.JSON

它展示了如何使JSON dict字段可变。 (默认值是不可变的)

像这样。。

from sqlalchemy.ext.mutable import MutableDict
from sqlalchemy import Column, Integer, JSON

class TableABC(Base):
    __tablename__ = 'table_abc'
    id = Column(Integer, primary_key=True)
    info = Column(MutableDict.as_mutable(JSON))

然后我可以将json字段更新为ORM。

相关问题 更多 >