sqlarchemy的json字段无法保存

文章讲述了如何在使用SQLAlchemy进行数据库操作时,遇到可变对象如MutableDict的数据修改未被持久化的问题,原因在于未触发脏检查机制。作者提供了手动触发脏检查的解决方案以确保数据更新被正确记录。

表定义和修改代码

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()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值