当前位置: 首页 > 面试题库 >

如何获取已更改字段的原始值?

郑承恩
2023-03-14
问题内容

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


问题答案:

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

session.rollback()

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

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

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

针对您想要的每个属性。



 类似资料:
  • 问题内容: 我有一个相当复杂的数据库结构,正在尝试进行审核。目前,我正在运行Envers,并且它审核对每个对象所做的更改。这真的很好! 我现在想在用户界面上显示一些审核信息。对象/表变得非常复杂,因此我正在寻找一种方法来查看审核中哪些字段已更改。当前存储每个带有修订ID的对象的快照。我可以查看每个对象的修订版本,然后手动查询以查看发生了什么更改,但是我想知道是否有一种方法可以存储哪些字段已更改。这

  • 如何获取字段的“真实”值? 我有一个框,我使用的是较新的HTML5输入类型: 这在Chrome29中得到了支持: (至少在Chrome 29中) 如何获取控件的“原始”值? 我试着浏览了Chrome的输入框的其他属性列表: null

  • 如何获得原始json输出。如果可能的话,我不想实现用户数据类和解析器。有什么办法吗? 标记重复的帖子(获得原始HTTP响应与改造)不是为Kotlin和我需要Kotlin版本。

  • 我在尝试重现一个我见过的游戏机械师。机械师是个装枪的人。 目前我已经设置好了,所以当你点击一个有“.武器”类的div时,它会倒数“弹药”,如果你到了0,它会说没有弹药。 如果你点击并按住“.武器”x时间,那么它就会进行重装。 问题是,当我做任何事情时,总是有很多---当我想重新装入武器3时,例如,我不知道如何获得那个div(“.warm”)开始的“ammo”的原始值。 我试着在var中设置值,但我

  • 问题内容: 有没有办法从获取原始/原始JSON值? 问题: 现在是,但是我需要原始字符串。 有没有办法获得这个原始价值?另外,我无法更改创建方式(例如更改设置),因为它作为参数传递给我的课程… (参考:原始的NJsonSchema问题) 问题答案: 您无法获取原始字符串,无法识别日期字符串并将其转换为自身内部的结构。如果您这样做,则可以看到以下内容: 但是,您可以通过执行以下操作以ISO 8601

  • 问题内容: 在我的模型中,我有: 第一次修改效果很好。 有人修改别名上的时,如何获取新图像?其次,是否有更好的方法来缓存远程映像? 问题答案: 本质上,你想覆盖方法,以便保留原始值的副本。这样一来,你就不必进行其他数据库查找(这总是一件好事)。