2011-12-20 61 views
2

使用Django 1.3與9.0的PostgreSQL,我有一個多步的對象創建函數/視圖,其中:創建Django transaction.commit_on_success - 提交仍然發生,儘管錯誤/異常,所以如何調試?

  1. 主要目的(曾經嘗試都MyModel.objects.create()和手動使用對象。 save()方法)和
  2. 然後建立m2m關係(它們必須跟隨主對象的創建,以便所述對象具有與之相關的id)。

其中一些關係可能會失敗,或者可能會出現其他問題,因此我需要整個函數以原子方式運行。我試過用transaction.commit_on_success修飾器包裝函數,以及嘗試使用commit_manually(並在函數結尾處設置提交點);但都不起作用。也就是說,即使稍後在函數中引發異常,也會創建主對象並將其保存在數據庫中。這使得數據庫處於不一致的狀態,以禮貌的態度。那麼,如何調試呢?我見過類似的問題,但是他們不得不使用MySQL,而這種破碎的交易不應該發生在Postgres上。 Django Trac從幾年前就有關這個問題的門票,但它們被認爲是固定/解決的。那裏的任何Djangonauts可以提供啓發嗎?

+0

你能顯示一些代碼嗎? – 2011-12-20 19:31:11

+0

@丹尼爾:不幸的是,不幸的是。如果您知道會干擾交易的事情,請告知,謝謝。 – limist 2011-12-20 20:38:42

+0

我發現sqlite的commit_on_success有時會引入奇怪的行爲,並發現commit_manually無法按預期工作。不要顯示一些有影響的代碼,並顯示一些錯誤或測試案例來證明這一點 - 沒有你不會在這裏得到答案,或讓django開發者認真對待它。 – Marcin 2011-12-20 23:35:07

回答

1

看到這個票:https://code.djangoproject.com/ticket/6669

我想現在你只需要調用transaction.rollback()明確,當你得到一個IntegrityError

+1

謝謝 - 這看起來與我所看到的至少有關。 – limist 2012-01-10 21:27:02

1

我不知道這是否適用於你,但問題帶我到這裏是沒有閱讀有關Django測試的手冊。

如果您正在測試包含事務的代碼,則需要使用TransactionTestCase而不是TestCase,否則將導致測試看到您描述的行爲。

+0

是的,雖然'TestCase'繼承自'TransactionTestCase',它*弄亂了*他父母的事務處理。人們可以爭辯說,這是一個合理的功能(如[文檔](https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.TransactionTestCase)),但**它會去反對Liskov替代原則。當我第一次遇到它時,我發現它非常不直觀。 – Manur 2013-02-16 00:09:56

相關問題