我将sqlalchemy用作我的orm,并declarative用作Base。
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可以获取字段的历史值,但是我不确定它是否适合我的目的。
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,但这是最好的方法吗?
\要查看是否user已修改,可以检查是否user in session.dirty。如果它是您要撤消它,则可以执行
user
user in session.dirty
session.rollback()
但是请注意,这会将会话的所有内容回滚到最后一个session.commit()。
session.commit()
如果您想获取原始值并且内存可以正确地为我服务,则它是sqlalchemy.orm.attributes.get_history实用程序函数返回的元组的第二个元素。你必须要做
sqlalchemy.orm.attributes.get_history
old_value = sqlalchemy.orm.attributes.get_history(user, 'attribute')[2]
针对您想要的每个属性。