2010-09-05 53 views
8

我使用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? 

在此先感谢!


UPDATE

我发现了一个方法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的值,但它是最好的方法吗?

+0

我认为'get_history'是正确的方法。这是一个记录在案的公共职能。 – aaronasterling 2010-09-05 12:59:57

回答

8

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

session.rollback() 

,但被告知,这将回滚一切为了会议最后session.commit()

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

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

为您需要的每个属性。

+0

谢谢,你知道如何获得原始价值吗? – Freewind 2010-09-05 12:01:46

+0

@Freewind。对不起,我错过了答案时,这是重点。更新。 – aaronasterling 2010-09-05 12:56:01

+0

再次感谢你:)我想我现在可以使用它。而且,正如我试过的,如果属性被修改了,我们应该得到第三个元素。如果我是对的,请编辑你的答案(只为让别人看到正确答案) – Freewind 2010-09-05 13:19:17