2017-02-23 102 views
0

我有类似Getting fields history before flush如何在session.flush()之后在sqlalchemy中获取更改字段的原始值?

这里一个小问题是我的代码:

user = User.query.filter(User.id == user_id).first() 

print(user.first_name) 
# Rick 

user.first_name = 'Anders' 

print(get_history(user, 'first_name')) 
# History(added=[u'Anders'], unchanged=(), deleted=[u'Rick']) 

db.session.flush() 

print(get_history(user, 'first_name')) 
# History(added=(), unchanged=[u'Anders'], deleted=()) 

所以,我可以轻松地刷新之前获得原始值。我可以使用get_history和会话的'dirty'属性。但是,当我做session.flush()这个方法显示一个不正确的结果,'脏'是空的。

但是,我可以在session.flush()之后使用session.rollback()回滚这些更改。 这就是为什么我认为有可能获得原始值。他们只是躲在某个地方。

但是哪里?

回答

0

调用Session.flush()写出所有未决的对象创建,删除和修改数据库中插入,删除,更新等

所以,当你调用session.flush()你的对象,你会添加( session.add(object))进入数据库,但他们没有永久写入,直到提交(session.commit())或回滚发生。

你的问题的答案:你的对象是在与session.flush()

+0

但如何回滚获取对象的前一个状态数据库? 所以,我执行'session.flush()',我的更改进入数据库。 而且这两个状态的前一个和当前的都存储在那里。我理解正确吗? 但是,我可以在不执行回滚的情况下获得以前的状态吗? 像'user.get_history_after_flush()' – MrCyberthrone

+0

我没有数据库服务器管理它,但是当你调用flush()更改到数据库。有一点需要注意;此更改仅适用于该会话。这意味着这些更改将不会通过另一个会话进行检索。如果你做了一个提交,那么你不能支持以前的值。 – metmirr

相关问题