2011-09-02 30 views
14

我曾經知道如何做到這一點,但我忘了。有時候,在使用Django shell的時候,你犯了一個錯誤,並導致事務中止。之後,您進行的任何進一步查詢都將導致DatabaseError:當前事務中止,直到事務結束時忽略命令。但是,我認爲有一種方法可以在手動發生時回滾事務,因此您不必重新啓動會話。誰能告訴我它是什麼?如何在導致DatabaseError後在Django shell會話期間回滾?

這個錯誤報告(https://code.djangoproject.com/ticket/10813)引用了該技術,但沒有解釋它。運行django.db.transaction.rollback導致「TransactionManagementError:此代碼不在事務管理之下」。

回答

20

在使用Postgres時,這種情況一直髮生在我身上,而且這真的讓人感到惱火。

你想:

from django.db import transaction 
transaction.rollback() 

大部分是細的時間(在我的經驗,它是安全的忽略TransactionManagementError)。

+0

感謝。我也從一開始就把我的會話置於事務管理之下。無論如何使事情變得更安全一些。 –

7

這是稍微好一點,因爲你得到關於TransactionManagementError沒有堆棧跟蹤:

from django.db import transaction 
transaction.rollback_unless_managed() 
+0

謝謝! ''信號.py'中加載了一些代碼,它在syncdb發生之前引用了ORM'.get()',這是我需要的創可貼。 (你知道的,而不是實際修復我的代碼,以避免數據庫查詢完全!) – pztrick

相關問題