sqlalchemy会话中未更新数据

时间:2018-12-24 08:49:56

标签: python-3.x sqlalchemy

我在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,但所有显示的内容只是在数据库中触发的选择命令。

我想念什么吗?

1 个答案:

答案 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