2010-02-18 83 views
7

我使用的Python與MySQL和Django。我不斷看到這個錯誤,我無法揣摩出異常被拋出:誰在拋出(並捕獲)這個MySQL異常?

Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method Cursor.__del__ of <MySQLdb.cursors.Cursor object at 0x20108150>> ignored

我有很多的「嘗試」在我的代碼和「例外」塊 - 如果在其中一個發生異常,那麼我會看到我自己的調試消息。上面的異常顯然是在某處被捕獲的,因爲當異常拋出時我的程序不會中止。

我很困惑,有人可以幫我嗎?

回答

3

這是一個Python錯誤。

請參見:http://eric.lubow.org/2009/python/pythons-mysqldb-2014-error-commands-out-of-sync/

它看起來像有一個與你的MySQLdb的查詢問題。

+1

感謝您的鏈接。我不使用任何明確的MySQL查詢或使用任何遊標對象。我所做的所有查詢都是通過Django對象進行的。對我來說,一個大問題是無法看到拋出異常的位置。 – 2010-02-18 20:17:34

+0

恢復:正如在PHP中,你不能打開第二個mysql的連接,而不關閉第一個! – 2012-03-07 20:28:23

2

我相信如果您使用多個線程中的相同連接/遊標,則會發生此錯誤。 但是,我不認爲Django的創建者犯了這樣的錯誤,但是如果你自己做了一件事情,它很容易發生。

+0

我的程序中沒有多線程,也只有一個程序正在運行。當我的程序運行時,我應該是唯一訪問數據庫的人。是否有任何調試技術來查看拋出異常的位置?我將我的程序設置爲運行一個大集數據。如果我只測試一小部分數據,一切都可以。但是,當我將它設置爲在整個集合上運行時,會出現此MySQL異常......現在,我運行整個集合並將管道標準和標準錯誤都管道化,以查看是否可以更好地瞭解問題正在顯現。 – 2010-02-18 21:50:56

2

打印出一堆東西和調試後,我想出了我認爲的問題。我使用的一個庫沒有關閉連接或遊標。但是,如果我迭代大量的數據,這個問題只會顯示出來。問題也是非常偶然的,我仍然不知道是誰拋出了「命令不同步」異常。但是現在我們關閉了連接和光標,我再也看不到這些錯誤了。

4

我確切地說有錯誤(使用MySQLdb和Django),並發現它被「忽略」的原因是它發生在__del__方法中。在__del__異常斷然忽略: object.__del__ datamodel

似乎沒有要任何方式進一步向上(至少根據this thread)堆棧捕獲它,但你可以編輯MySQLdb的/ cursors.py或monkey-修補程序以獲取您自己的__del__,它會捕獲異常並將您放入pdb提示符或記錄完整的回溯。

+0

您是否曾經能夠確定最終導致錯誤的特定代碼?我想知道在使用Django中的一個特定的問題,一個通用的模塊,或特別是我的代碼。 – 2012-11-08 16:42:48

+1

根本問題完全是我的錯(在線程之間共享數據庫連接),並且在嘗試刷新結果集時關閉連接時發生異常。與往常一樣,Django唯一的責任是在發生任何遠程意外事件時無法調試。 – 2012-11-08 17:35:01