sqlarchemy的json字段无法保存

表定义和修改代码

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

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值