【问题标题】:How to get the original value of changed fields?如何获取更改字段的原始值?
【发布时间】:2011-04-08 10:19:58
【问题描述】:

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

【问题讨论】:

  • 我认为get_history 是正确的方法。这是一个记录在案的公共功能。

标签: python sqlalchemy insert-update


【解决方案1】:

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

session.rollback()

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

如果您想获得原始值并且记忆正确,它是sqlalchemy.orm.attributes.get_history 实用函数返回的元组的第二个元素。你必须这样做

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

对于您想要的每个属性。

【讨论】:

  • 谢谢,你知道如何获取原始值吗?
  • @Freewind。抱歉,我在答案中错过了这一点。已更新。
  • 再次感谢您:) 我想我现在可以使用它了。而且,正如我所尝试的,如果属性已被修改,我们应该得到第三个元素。如果我是对的,请编辑您的答案(只是为了让其他人看到正确的答案)
猜你喜欢
  • 1970-01-01
  • 2017-06-07
  • 2013-09-22
  • 2020-10-27
相关资源
最近更新 更多