我在sqlalchemy中更新实例时遇到问题。 在提交之前修改实例属性后,实例属性会更改,但是在提交之后,实例属性会恢复为先前的值。即使数据更新后,session.is_modified(instance)也会返回False。
这是代码
from sqlalchemy.orm import sessionmaker, scoped_session
class Backend(object):
"""
"""
def __init__(self):
self._engine = create_engine("mysql://{0}:{1}@{2}/{3}?charset=utf8".format(DATABASE_CONFIGS.get('master').get('USER'),
DATABASE_CONFIGS.get('master').get('PASSWORD'),
DATABASE_CONFIGS.get('master').get('HOST'),
DATABASE_CONFIGS.get('master').get('DB_NAME')),
pool_recycle=3600,
pool_size= POOL_SIZE,
pool_timeout=1,
echo=False,
convert_unicode=True,
encoding='utf-8')
def get_session(self):
self._session = scoped_session(sessionmaker(bind=self._engine))
return self._session
class A():
attribute_meta = Column(JSONField(), nullable=True)
这是代码的运行方式:
def foo():
backend = Backend()
session = backend.get_session()
a = session.query(A).first()
a.attribute_meta = {'boo':'foo'}
session.add(a)
print("data before commit", a.attribute_meta)
print("is session modified", session.is_modified(a))
print("data after commit", a.attribute_meta)
session.commit()
session.close()
被修改的会话返回False
提交之前的数据返回带有适当数据的修改后的实例
提交后的数据返回实例的原始值,即未修改
如果我通过shell运行相同的代码,则可以正常运行。
该模型也没有发布信号,也不会改变数据。
打开echo = True,但所有显示的内容只是在数据库中触发的选择命令。
我想念什么吗?
答案 0 :(得分:0)
我尝试更改的属性是JSON字段,而sqlalchemy不会检查JSON字段中的更改。 这就是为什么这些更改在提交之前存在于实例中,但在提交之后却消失了的原因。 解决方案是强制使实例变脏,即,使sqlalchemy故意检查属性更改。
这是代码更改-
from sqlalchemy.orm.attributes import flag_modified
flag_modified(bag, 'affiliate_meta') # Just because sqlalchemy doesnt track json field changes, check it before committing the session