2010-02-18 84 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