2016-06-09 74 views
1

我們將我們的一個主要django站點從1.4升級到1.9。我想要pull a github並使用laboratory來針對現有生產站點測試升級的站點。但是,由於顯而易見的原因,我無法將新站點寫入(postgres)生產數據庫。使用中間件回滾所有Django數據庫交易

現在,我可能會給這隻讀實例只讀數據庫的權限只是爲了確保,但我不能讓它在每次寫入時出錯。似乎我應該能夠設置有問題的數據庫連接使用ATOMIC_REQUESTS = True,然後編寫中間件在每個請求結束時回滾事務,但是自從1.4以來,在Django的事務處理中發生了很多變化相當確定實現該中間件的最佳方式。

我該如何編寫中間件來可靠地回滾每個事務,不管是什麼?

回答

1

正確的做法是設置AUTOCOMMIT=False,而不是一套ATOMIC_REQUESTS =真

您可以針對給定的 數據庫在其配置設置自動爲False完全禁用Django的事務管理。如果你 這樣做,Django將不會啓用自動提交,並且不會執行任何 提交。您將獲得底層數據庫 庫的常規行爲。 這要求您明確提交每個事務,即使是由Django或第三方庫啓動的事務。因此,在您想運行自己的 交易控制中間件或執行一些非常奇怪的事情時,最好使用 。

所以除非你提交所有的東西,否則實際上沒有任何東西進入數據庫。如果您使用數據庫支持的會話,則需要在那裏進行手動提交,但保留其他所有內容。這將避免修改活動服務器中的任何數據。

AUTOCOMMIT =假進入settings.py如下:

DATABASE = { 
    'default': { /* other stuff */, 
     AUTOCOMMIT: False, 
    } 
} 

這種方法不涉及任何自定義中間件的創建。它可以很容易地打開和關閉。

+0

輝煌。我會試一試。但有一個問題:如果我沒有回滾事務並且沒有提交它們,我現在是否需要擔心它們堆積如此,Django也具有持久連接? –

+0

那個我真的不知道,但爲了測試的目的,因爲你沒有做成千上萬的交易,我不認爲這很重要。順便說一句,你不必手動回滾。 – e4c5

+0

我還沒有得到它 - 其他優先事項出現了。 :)一旦我嘗試過,我會再回來看看。在這一點可能需要幾個星期。 –