Python 如何获取更改字段的原始值?
我使用sqlalchemy作为我的orm,并使用Python 如何获取更改字段的原始值?,python,sqlalchemy,insert-update,Python,Sqlalchemy,Insert Update,我使用sqlalchemy作为我的orm,并使用声明性作为基础 Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) 我的问题是,如何知道用户已被修改,以及如何在不再次查询数据库的情况下获取原始值 user = Session.query(User).filter_b
声明性作为基础
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\u history
的值,但这是最好的方法吗?\要查看user
是否已被修改,您可以检查会话中的user.dirty
。如果是,并且您希望撤消它,则可以执行
session.rollback()
但请注意,这会将会话的所有内容回滚到最后一个会话。commit()
如果您想获得原始值并正确使用内存,那么它是sqlalchemy.orm.attributes.get_history
实用程序函数返回的元组的第二个元素。你必须这么做
old_value = sqlalchemy.orm.attributes.get_history(user, 'attribute')[2]
对于您想要的每个属性。谢谢,您知道如何获取原始值吗?@Freewind。很抱歉,我在回答这个问题时漏掉了。更新。再次感谢:)我想我现在可以用了。而且,正如我所尝试的,如果属性被修改,我们应该得到第三个元素。如果我是对的,请编辑您的答案(只是为了让其他人看到正确的答案)。我认为get_history
是正确的方法。这是一项有案可查的公共职能。