2010-02-18 5 views
7

Ich benutze Python mit MySQL und Django. Ich halte diesen Fehler zu sehen, und ich kann nicht herausfinden, wo die Ausnahme ausgelöst wird:Wer wirft (und fängt) diese MySQL-Ausnahme?

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

Ich habe viele „versuchen“ und „Ausnahme“ Blöcke in meinem Code - wenn die Ausnahme trat innerhalb einer dieser auf, dann würde ich meine eigenen Debugging-Nachrichten sehen. Die obige Ausnahme wird offensichtlich irgendwo gefangen, da mein Programm nicht abbricht, wenn die Ausnahme ausgelöst wird.

Ich bin sehr verwirrt, kann mir jemand helfen?

Antwort

3

Dies ist ein Python-Fehler.

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

Es sieht aus wie ein Problem mit Ihrer MySQLdb Abfrage ist.

+1

danke für den link. Ich verwende keine expliziten MySQL-Abfragen oder verwende irgendwelche Cursor-Objekte. Alle Abfragen, die ich mache, gehen durch Django-Objekte. Ein großes Problem für mich ist nicht in der Lage zu sehen, wo diese Ausnahme geworfen wird. –

+0

Fortsetzen: Wie in PHP können Sie keine zweite MySQL-Verbindung öffnen, ohne die erste zu schließen! –

2

Ich glaube, dieser Fehler kann auftreten, wenn Sie die gleiche Verbindung/Cursor aus mehreren Threads verwenden. Allerdings glaube ich nicht, dass die Schöpfer von Django einen solchen Fehler gemacht haben, aber wenn Sie etwas selbst machen, kann es leicht passieren.

+0

Ich habe keine Multithreading in meinem Programm, auch nur eine Instanz meines Programms läuft. Ich sollte der einzige sein, der auf die Datenbank zugreift, wenn mein Programm läuft. Gibt es Debugging-Techniken, um zu sehen, wo die Ausnahme ausgelöst wird? Ich habe mein Programm so eingestellt, dass es über große Datenmengen läuft. Wenn ich nur eine kleine Teilmenge von Daten teste, ist alles in Ordnung. Aber wenn ich es auf den ganzen Satz ausstelle, erscheint diese MySQL - Ausnahme ... Im Moment laufe ich den ganzen Satz und führe sowohl Standard - als auch Standardfehler durch, um zu sehen, ob ich eine bessere Vorstellung davon bekommen kann, wo Problem taucht auf. –

2

Nachdem ich eine Menge Zeug und Debugging ausgedruckt habe, habe ich das Problem herausgefunden, denke ich. Eine der Bibliotheken, die ich verwendete, schloss die Verbindung oder den Cursor nicht. Dieses Problem taucht jedoch nur auf, wenn ich eine große Datenmenge iteriere. Das Problem ist auch sehr zeitweise und ich weiß immer noch nicht, wer die Ausnahme "Befehl außer Synchronisation" auslöst. Aber jetzt, wo wir sowohl die Verbindung als auch den Cursor geschlossen haben, sehe ich die Fehler nicht mehr.

4

Ich hatte genau diesen Fehler (mit MySQLdb und Django) und festgestellt, dass der Grund, warum es "ignoriert" wurde, dass es in einer __del__ Methode aufgetreten ist. Ausnahmen in __del__ sind kategorisch ignoriert: object.__del__ datamodel

Es gibt keinen Weg zu sein scheint es von weiter oben auf dem Stapel zu fangen (zumindest nach this thread), aber Sie können MySQLdb/cursors.py bearbeiten oder Affen- patch, um Ihre eigene __del__ in dort, die die Ausnahme abfängt und Sie in eine pdb-Eingabeaufforderung ablegt oder eine vollständige traceback protokolliert.

+0

Konnten Sie jemals den spezifischen Code ermitteln, der den Fehler verursacht hat? Ich frage mich, ob es ein spezifisches Problem mit der Verwendung von mysql in Django, einem gemeinsamen Modul oder insbesondere meinem Code gibt. –

+1

Das Grundproblem war total mein Fehler (teilen eine DB-Verbindung zwischen Threads), und die Ausnahme passiert beim Schließen der Verbindung, beim Versuch, eine Ergebnismenge zu löschen. Djangos einzige Schuld in der Sache war wie immer, dass es unmöglich gemacht wurde zu debuggen, wenn irgendetwas Unvorhergesehenes passiert. –