10

我使用 sqlalchemy 作为我的 orm,并declarative用作 Base。

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,但这是最好的方法吗?

4

1 回答 1

12

\要查看是否user已修改,您可以检查user in session.dirty. 如果是并且您想撤消它,您可以执行

session.rollback()

但请注意,这会将会话的所有内容回滚到最后session.commit()

如果您想获得原始值并且内存正确地为我服务,它是sqlalchemy.orm.attributes.get_history实用函数返回的元组的第二个元素。你必须做

old_value = sqlalchemy.orm.attributes.get_history(user, 'attribute')[2]

对于您想要的每个属性。

于 2010-09-05T11:09:46.927 回答