未在sqlalchemy(sqlalchemy-utils)中提交列更新

时间:2015-01-09 12:37:57

标签: python postgresql sqlalchemy

我有一个User模型,还有一些密码列(PasswordType),以及许多其他列。当我尝试这样做时

user = # get some user with some query
print(user.password)
# there is a password

user.password = 'something else'
db.session.is_modified(user)
# True
db.session.commit()
print(user.password)
# prints new password

user.password = None
db.session.is_modified(user)
# True
db.session.commit()
print(user.password)
# This correctly prints None

# Now the funny part,
user.password = 'something new again'
db.session.is_modified(user)
# False
db.session.commit()
print(user.password)
# Prints None again.

我已经在这里工作了几个小时,无法弄清楚为什么会发生这种情况。

2 个答案:

答案 0 :(得分:1)

问题在于PasswordType中的SQLAlchemy-utils

当我拨打force_auto_coercion时,它可以正常工作。

答案 1 :(得分:0)

这可能会回答您的问题:请查看:http://docs.sqlalchemy.org/en/rel_0_9/orm/session_api.html#sqlalchemy.orm.session.Session.is_modified

  

使用此方法测试时,Session.dirty集合中的实例可能会报告False。这是因为对象可能已经通过属性变异接收到更改事件,因此将其放在Session.dirty中,但最终状态与从数据库加载的状态相同,导致此处没有净更改。

您可能还希望将此用作状态管理实用程序(以了解您的实例所处的状态)。

>>> from sqlalchemy.orm.util import object_state
>>> print object_state(instance)