2013-09-26 91 views
0

內聲明的基礎的我定義一個函數是這樣的:SQLAlchemy的提交更改

def update_me(self): 
    if self.raw_info==1: self.changed_info=10 
    else: self.changed_info=20 

我知道這可以用hybrid_property做,但我其實可以做更復雜的操作,以上只是用於說明目的,這必須通過一種方法來完成。我如何從聲明基礎內部提交這些更改,而不傳遞會話對象?似乎合乎邏輯的是,如果我可以訪問對象並在沒有會話對象的情況下更改其值,那麼似乎我應該能夠以某種方式將它保存在此處。當然,將此代碼添加到上述功能的末尾失敗

self.commit() 
+0

我不確定是否有任何機制可以做到這一點。承諾是一項昂貴的操作,並且在所有更新完成後通常會執行一次。通常,在setter方法中調用昂貴的操作並不是一個好主意。 – drkstr1

+0

這對我來說似乎是個壞主意,而不僅僅是因爲提交會是一個「昂貴」的操作:更重要的是,SQLAlchemy基於將業務邏輯與持久性邏輯分開的想法。任何使用你的代碼的人(包括你自己幾個月後)都需要仔細確定他們可以安全調用哪些方法,而不會過早地提交會話。 –

回答

1

在我看來,您可能想重新考慮您的設計。但是,如果你一定要這樣走,你可以使用object_session方法:

object_session(self).commit() 

警告:這樣會提交您的整個會話(不只是一個對象),它只會工作如果self已附加到會話中(例如,Session.add或查詢過它)。因此,這將是一個脆弱的操作,除非絕對必要,否則我不會推薦它。

但你是對的,當你說

這似乎是合乎邏輯,將有一個辦法,如果我可以訪問該對象並改變其值沒有會話對象,然後好像我應該是能夠以某種方式在這裏保存它。

對象和會話已連接,因此更改將傳遞到數據庫。我們用上面的方法得到這個連接的會話。