表定义和修改代码
from sqlalchemy import Column, Integer, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.mutable import MutableDict
import json
Base = declarative_base()
class MyModel(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
data = Column(MutableDict.as_mutable(JSON), default={})
# 创建数据库引擎和表
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
# 创建会话
Session = sessionmaker(bind=engine)
session = Session()
# 创建实例并添加到数据库
obj = MyModel()
session.add(obj)
session.commit()
# 查询数据库,检查数据是否为空字典
result = session.query(MyModel).first()
print(result.data) # 输出: {}
# 更新数据并提交到数据库
result.data['key'] = 'value'
session.commit()
# 再次查询数据库,检查数据是否更新
updated_result = session.query(MyModel).first()
print(updated_result.data) # 输出: {'key': 'value'}
现象
data并未修改,仍然是{}
原因
由于未正确触发 SQLAlchemy 的脏检查机制所致。在 SQLAlchemy 中,如果你直接修改了类似于字典这样的可变对象,并未触发其脏检查机制,那么在提交到数据库时,这些修改可能不会被记录下来。
为了确保 SQLAlchemy 能够正确地捕获对可变对象的修改,并在提交时保存这些修改,你需要确保正确地触发了脏检查机制。
以下是一个可行的解决方案,你可以尝试在对 data
字段进行修改后,手动触发一次对象的脏检查:
from sqlalchemy.orm.attributes import flag_modified
# 更新数据并提交到数据库
result.data['key'] = 'value'
flag_modified(result, "data") # 手动触发脏检查机制
session.commit()