2014-03-12 30 views
4

更新發佈後的對象session.commit()工作正常嗎?或者我需要刷新對象?在SQLAlchemy中的session.commit()後更新對象

我認爲這個問題已經足夠了,但如果需要的話,我可以提供更多的信息來清除我的問題。

編輯:

通過更新,我的意思是設定對象的某些屬性,即列值。

回答

4

簡短回答:不,你不需要手動刷新,sqlalchemy會爲你做。


知道它何時發生是有用的,所以下面是簡短的概述。 從Session.commit()文檔:

默認情況下,會議還交易後到期的所有數據庫負載狀態上的所有 ORM管理屬性提交。這樣後續操作就會從數據庫加載最新的數據。 此行爲可以使用sessionmaker或Session構造函數的expire_on_commit = False選項 禁用。

基本上,給你不設置expire_on_commit=False,對象將被自動一旦你嘗試session.commit()後訪問(讀取,未設定)它的屬性刷新。

my_obj = session.query(MyType).get(1) 
my_obj.field1 = 'value1' 
session.commit() # will commit and expire my_obj 

my_obj.field1 = 'new value' # object is still the same, but field is updated 
print my_obje.field1 # at this point SA will first refresh the object from the database; and make sure that new values for changed fields are applied 

事實上,如果你啓用日誌記錄,你會發現sqlalchemy只要你訪問(讀取)發出新SELECT語句持續性實例屬性。

+0

我想你誤會了我?我在詢問**更新**一個對象,即更新一個/某些列值。請您澄清一下,因爲我認爲我對「更新」一詞的選擇可能會產生誤導。 – giga

+0

好吧,我的答案涵蓋的內容並不相同,但其中很大一部分仍然相關。所以,基本上,在我的答案('my_obj.field1 ='new value')的行後面,只有在內存中才會發生這種變化。爲了讓你的數據庫反映這種變化,你將不得不再次調用'session.commmit()'。這是否覆蓋它? – van

+0

是的,非常感謝。 – giga

相關問題