2012-05-08 36 views
0

我有一個模型方法的事情:更新模型的方法:SQLAlchemy的

def method(self, session): 
     if self.column_value is None: 
      self.column_value = some expensive calculation 
      session.add(self) 
      session.commit() 
      return self.column_value       
     else: 
      return self.column_value 

所以,我可以運行thing_instance.method和返回COLUMN_VALUE,如果需要計算。這是我在別處做的,我正在嘗試適應做這個w/python。

這不工作,因爲我想,我得到錯誤嘉豪....什麼是更好的方法?

編輯:

這個方法是簡而言之。我有thing_instance並調用thing_instance.method()。我得到的錯誤是:

sqlalchemy.exc.InterfaceError: (InterfaceError) Error binding parameter 0 - probably unsupported type 

這可能會更有用。

我會根據要求提供更具體的代碼,但這會分散我的問題。這裏的問題是:如何在sqlalchemy模型上編寫一個方法來計算並更新實例列值(如果未設置列值)?在pythoinic/sqlalchemic方式?我試圖在變化沒有工作,所以我把它放在一邊,問這個問題

EDIT2:

這是一個列類型錯誤.....計算值是一個列表,我需要轉換或者使用PickleType作爲列。任何指針仍然讚賞。

+1

你能否提供一些你得到的錯誤,或者提供一些更好的代碼來更好的展示你的方法被調用? – Cryptite

+1

我建議不要將會話邏輯直接放在模型類中。模型類應該簡單地表示數據,其他方法可以對該數據進行無狀態計算。如果你有其他的東西來處理會話和有狀態的行爲,我想你會發現你的應用程序在一般情況下更易於管理。 – wberry

+0

在繼續之前,我確實重構了會話,參見上文。如果我需要做更多的事情,請指出我需要的資源,以便與這種背景有關。我敢肯定還有什麼地方可以放任何東西;在我的上下文中,「昂貴的計算」是一個導入的類,它操縱模型中的另一個字段以創建一個新字段。 – blueblank

回答

0

您提到的錯誤是因爲整數0對於所討論的類型是無效值?另外,如果thing_instance已經處於持續連接狀態,則不需要將其添加到會話中!另外,session.commit()最有可能不是你真正想要在這裏,也許你的意思是session.flush()

+0

我還在學習......管理會話對我來說是新的。我只是試圖在模型中構建接口來創建,刪除和更新實例。最初的錯誤是基於模型中錯誤的列類型,而不是我的方法。 – blueblank

+0

問題是,在概念上,DeclarativeBase類不應該真正意識到會話本身。 –

相關問題