2017-02-23 34 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

相關問題