2012-08-24 24 views
5

我有一個SQL Alchemy的問題 - 我的應用程序作爲一個持續工作的Python應用程序。如何避免在sqlalchemy中進行緩存?

我有這樣的功能:

def myFunction(self, param1): 
    s = select([statsModel.c.STA_ID, statsModel.c.STA_DATE)])\ 
         .select_from(statsModel) 

    statsResult = self.connection.execute(s).fetchall() 

    return {'result': statsResult, 'calculation': param1} 

我認爲這是明顯的例子 - 一個結果集是從數據庫中提取,二是就像參數傳遞。

問題是,當我更改數據庫中的數據時,此函數仍會返回沒有任何更改的數據。當我在輸入參數中更改數據時,返回的參數「計算」具有適當的值。

當我重新啓動應用程序服務器時,情況恢復正常 - 從MySQL獲取新數據。

我知道有關於SQLAlchemy的緩存就像幾個問題:

How to disable caching correctly in Sqlalchemy orm session?

How to disable SQLAlchemy caching?

,但我怎麼能等調用這種情況呢?看起來SQLAlchemy保存之前獲取的數據,並且在應用程序重新啓動之前不會執行新的查詢。我怎樣才能避免這種行爲?

+0

你如何改變數據庫中的數據?這是否改變了承諾? – icecrime

+0

我改變它manualy。數據庫引擎是MySQL。是的,變化是承諾的。 – Archarius

+0

http://stackoverflow.com/a/15788051/497208可能有用 –

回答

1

有幾種可能性。

  1. 您正在重複使用您的session不正確或不正確的時間。最佳做法是在您提交之後丟棄您的session,並在最後一刻使用它之前獲得一個新的。似乎緩存的行爲實際上可能是由於應用程序中的生命週期很長。
  2. 存活時間超過session的對象不會合併到後續的session中。如果您沒有重新合併它們,「元數據」可能無法更新其狀態。這是SQLAlchemy的ORM API的一個問題,您目前還沒有看到它的使用。
  3. 您的更改未提交。你說他們是這樣,我們會認爲這不是,但如果沒有其他途徑解釋它,你可能想再看一遍。

一個常規調試提示:如果您想知道到底是什麼的SQLAlchemy數據庫是幹什麼的,通過echo=Truecreate_engine功能。引擎將打印它運行的所有查詢。

另外check out this suggestion我向其他使用ORM並且有事務性問題的其他人提出瞭解決問題的方案,但沒有明確指出問題。也許它會幫助你。