如何获取更改字段的原始值?
我正在使用sqlalchemy作为我的对象关系映射工具,并且使用declarative
作为基础。
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
我想知道,怎么才能知道一个用户是否被修改过,以及如何在不重新查询数据库的情况下获取原来的值呢?
user = Session.query(User).filter_by(id=user_id).first()
# some operations on user
....
# how do I know if the user.name has been changed or not?
...
# How do get the original name?
提前谢谢你们!
更新
我发现有一个方法get_history
可以获取某个字段的历史值,但我不确定这是否是我想要的正确方法。
from sqlalchemy.orm.attributes import get_history
user = Session.query(User).first()
print user.name # 'Jack'
print get_history(user, 'name') # ((),['Jack'],())
user.name = 'Mike'
print get_history(user, 'name') # (['Mike'], (),['Jack'])
所以,我们可以检查get_history
的值,但这真的是最好的方法吗?
1 个回答
15
要检查一下 user
是否被修改过,你可以看看 user in session.dirty
。如果确实被修改了,而你又想撤销这些修改,可以执行
session.rollback()
不过要注意,这样做会把这个会话中的所有内容都恢复到上一次 session.commit()
的状态。
如果你想获取原来的值,记得是从 sqlalchemy.orm.attributes.get_history
这个工具函数返回的元组中的第二个元素。你需要对每个你想要的属性都执行
old_value = sqlalchemy.orm.attributes.get_history(user, 'attribute')[2]
这样操作。