2010-09-15 8 views
7

Ich bin mit diesem Befehl in einem Python-Skript:psycopg2.InternalError: Wie kann ich mehr nützliche Informationen erhalten?

try: 
    print sql_string 
    cursor.execute(sql_string) 
except: 
    print sys.exc_info() 

und bekommen:

(<class 'psycopg2.InternalError'>, InternalError('current transaction is aborted, commands ignored until end of transaction block\n',), <traceback object at 0x1010054d0>) 

Allerdings, wenn ich die sql_string von der psql Befehlszeile versuchen, es funktioniert gut. Ich weiß, das Skript verbindet sich mit der Datenbank in Ordnung, weil ich andere Befehle ausführen kann.

Wie kann ich Python dazu bringen, mir nützlichere Informationen darüber zu geben, warum dieser Befehl im Skript fehlschlägt?

Antwort

8

Versuchen Sie folgendes:

try: 
    print sql_string 
    cursor.execute(sql_string) 
except Exception, e: 
    print e.pgerror 

Wenn Sie noch immer „aktuelle Transaktion abgebrochen wird, Befehle bis zum Ende des Transaktionsblock ignoriert“ dann Fehler weiter zurück in Ihre Transaktion ist und diese Abfrage nur versagt aufgrund Eine vorherige Abfrage ist fehlgeschlagen (wodurch die gesamte Transaktion ungültig wird).

Die Einzelheiten für pgerror finden Sie in der Dokumentation zu http://initd.org/psycopg/docs/module.html#exceptions

4

Sie auch Schwanz kann die Ausgabe von postgresql gefunden werden, um die Abfrage zu sehen, die den Fehler verursacht hat:

$ tail -f /var/log/postgresql/postgresql.log 

Dies ist oft einfacher als die Bearbeitung das Skript, um es zu debuggen.

+0

Mit Blick auf das Protokoll, sah ich sofort eine andere Tabelle hatte eine Einfügung fehlgeschlagen, und dies erstellt den Transaktionsblock. Die Tischplatte, die ich dachte, war das Problem, es war in Ordnung. – zerocog

Verwandte Themen