2010-02-18 10 views
7

estoy usando Python con MySQL y Django. Sigo viendo este error y no puedo averiguar donde se produce la excepción:¿Quién está lanzando (y atrapando) esta Excepción de 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

tengo muchos "tratar" y "excepción" bloques en mi código - si el excepción ocurrida dentro de uno de esos, luego vería mis propios mensajes de depuración. La excepción anterior obviamente se está capturando en alguna parte ya que mi programa no aborta cuando se lanza la excepción.

Estoy muy desconcertado, ¿alguien puede ayudarme?

Respuesta

3

Esto es un error de Python.

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

Parece que hay un problema con su MySQLdb consulta.

+1

gracias por el enlace. No uso ninguna consulta explícita de MySQL ni uso ningún objeto de cursor. Todas las consultas que hago pasan por objetos de Django. Un gran problema para mí es no poder ver dónde se lanza esta excepción. –

+0

Reanudar: como en php, ¡no puedes abrir una segunda conexión de mysql sin cerrar la primera! –

2

Creo que este error puede ocurrir si está utilizando la misma conexión/cursor de varios hilos. Sin embargo, no creo que los creadores de Django hayan cometido ese error, pero si estás haciendo algo por ti mismo puede suceder fácilmente.

+0

No tengo multiprocesamiento en mi programa, también solo se está ejecutando una instancia de mi programa. Debería ser el único que accede a la base de datos cuando mi programa se está ejecutando. ¿Hay alguna técnica de depuración para ver dónde se lanza la excepción? Tengo mi programa configurado para ejecutar sobre un gran conjunto de datos. Si solo pruebo un pequeño subconjunto de datos, todo está bien. Pero cuando lo configuré para que se ejecutara en todo el conjunto, aparece esta excepción de MySQL ... En este momento, estoy ejecutando todo el conjunto y conectando el estándar y el error estándar para ver si puedo tener una mejor idea de dónde está el problema está apareciendo. –

2

Después de imprimir un montón de cosas y depurar, descubrí el problema, creo. Una de las bibliotecas que utilicé no cerró la conexión o el cursor. Pero este problema solo aparece si repito una gran cantidad de datos. El problema también es muy intermitente y todavía no sé quién lanza la excepción de "comando fuera de sincronización". Pero ahora que cerramos tanto la conexión como el cursor, ya no veo los errores.

4

Tuve exactamente ese error (usando MySQLdb y Django) y descubrí que la razón por la que se "ignoraba" era que ocurría en un método __del__. Las excepciones en __del__ son ignorados categóricamente: object.__del__ datamodel

No parece haber ninguna manera de atraparlo desde más arriba en la pila (al menos según this thread), pero se puede editar MySQLdb/cursors.py o de mono parche para obtener su propio __del__ que capte la excepción y lo deje en un indicador de pdb o registre un rastreo completo.

+0

¿Alguna vez pudo determinar el código específico que finalmente le causó el error? Me pregunto si hay un problema específico con el uso de mysql dentro de Django, un módulo común o mi código en particular. –

+1

El problema de raíz fue totalmente mi culpa (compartiendo una conexión db entre subprocesos), y la excepción ocurre al cerrar la conexión, al intentar vaciar un conjunto de resultados. La única culpa de Django en este asunto fue, como de costumbre, imposibilitando la depuración cuando ocurre algo remotamente inesperado. –

Cuestiones relacionadas