Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取更改字段的原始值?_Python_Sqlalchemy_Insert Update - Fatal编程技术网

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

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

我使用sqlalchemy作为我的orm,并使用
声明性
作为基础

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
是正确的方法。这是一项有案可查的公共职能。