2012-10-11 70 views
1

這裏是我的情況: 第一視圖呈現形式,數據去SECEND視圖,其中i其存儲在數據庫(MySQL的)和重定向到顯示了被寫入數據庫第三種觀點:的SQLAlchemy /金字塔DBSession刷新問題

Stoing to db: 
    DBSession.add(object) 
    transaction.commit() 

DB Session: 
    DBSession = scoped_session(sessionmaker(expire_on_commit=False, 
              autocommit=False, 
              extension=ZopeTransactionExtension())) 

之後,當我刷新我的頁面幾次有時我可以看到數據庫更改,有時不會,一次舊數據,第二次新的等等...當我重新啓動服務器(本地,pserve)DB數據是最新。

也許這是創建會話的問題?

+1

你能編輯你的問題,以顯示DBSession變量的確切位置以及如何從第二個視圖重定向到第三個?您還可以提供一個粗略的視圖功能 – Sergey

回答

0

檢查MySQL的transaction isolation level

InnoDB的默認值爲REPEATABLE READ:「同一事務中的所有一致讀取讀取第一次讀取建立的快照。」

您可以在調用create_engine時指定隔離級別。請參閱SQLAlchemy docs

我建議你嘗試一下READ COMMITTED隔離級別,看看能否解決你的問題。

+0

對不起,它沒有幫助 - 保存到數據庫和重定向後同樣的問題 - 有一次,當我刷新我有新的數據,第二次舊的,幾經刷新後「穩定」 – papaduda

+0

嗯。我唯一能想到的其他事情就是''ZopeTransactionExtension''。我不確定它做了什麼,你可以嘗試沒有它? – codeape

+0

ZopeTransactionExtension確保每個打開的會話都加入一個活動的事務,沒有它就是一樣的。 – papaduda

0

緩存怎麼樣?

輸出是否緩存在服務器端?

瀏覽器是否顯示舊的緩存版本的頁面?

0

您不清楚您的事務對象是什麼或者它如何連接到SQLAlchemy數據庫會話。我在金字塔文檔中看不到有關事務的任何內容,並且在代碼中沒有看到任何將您的事務對象鏈接到SQLAlchemy會話的東西,因此可能缺少一些配置。基於這個代碼的例子是什麼?

另外:sessionmaker調用通常在文件評分中完成,以創建單個會話工廠,然後重複使用該會話工廠從同一來源創建會話對象。 "the sessionmaker() function is normally used to create a top level Session configuration which can then be used throughout an application without the need to repeat the configurational arguments."

可能出現這種情況,因爲您正在創建多個會話工廠,因此有一些數據應該在會話間共享,但實際上不會共享,因爲它在每個工廠都創建一次。嘗試just calling sessionmaker once,看看是否有所作爲。

0

我相信你的問題可能是一個持續的會話。默認情況下,在提交之後,金字塔將在會話中過期所有對象 - 這意味着SQLA將在您下次希望它們從數據庫中獲取它們,並且它們將是新鮮的。

您已通過指示「expire_on_commit = False」覆蓋了此默認值 - 因此,如果您打算讓該會話對象在後續請求中獲取新數據,請確保在提交更改後調用session.expire_all()。 (會話對象是在金字塔的多個請求相同,但你不能保證得到相同的線程範圍會)我不建議設定到期承諾虛假,或使用非全局會話:看http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/sqlalchemy.html#using-a-non-global-session

或者,您可以確保您在需要時到期的對象,知道未到期的對象將保留在內存中會是這樣的,不會被刷新,並且可以從同一個對象在不同的​​線程範圍的會議有所不同。