Ich habe viele Fehler mit der Nachricht erhalten:
"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"
nach dem Wechsel von Python-Psycopg zu Python-Psycopg2 als Datenbank-Engine des Django-Projekts.
Der Code bleibt derselbe, ich weiß nur nicht, woher diese Fehler stammen.
python
django
postgresql
psycopg2
Jack
quelle
quelle
conn.rollback()
(wobei conn Ihr Verbindungsobjekt ist), wird der Fehler behoben, sodass Sie andere Abfragen ausführen könnenAntworten:
Dies ist, was postgres tut, wenn eine Abfrage einen Fehler erzeugt und Sie versuchen, eine andere Abfrage auszuführen, ohne zuvor die Transaktion zurückzusetzen. (Sie können es sich als Sicherheitsfunktion vorstellen, um zu verhindern, dass Ihre Daten beschädigt werden.)
Um dies zu beheben, möchten Sie herausfinden, wo im Code diese fehlerhafte Abfrage ausgeführt wird. Es kann hilfreich sein, die Optionen log_statement und log_min_error_statement auf Ihrem Postgresql-Server zu verwenden.
quelle
Um den Fehler zu beheben, setzen Sie die letzte (fehlerhafte) Transaktion zurück, nachdem Sie Ihren Code repariert haben:
Sie können try-Except verwenden, um das Auftreten des Fehlers zu verhindern:
Siehe: Django-Dokumentation
quelle
IntegrityError
und nicht die BasisklasseDatabaseError
?Also bin ich auf dasselbe Problem gestoßen. Das Problem, das ich hier hatte, war, dass meine Datenbank nicht richtig synchronisiert wurde. Einfache Probleme scheinen immer die größte Angst zu verursachen ...
Geben Sie Folgendes ein, um Ihre Django-Datenbank in Ihrem App-Verzeichnis innerhalb des Terminals zu synchronisieren:
Bearbeiten: Wenn Sie django-south verwenden, kann dieses Problem auch durch Ausführen des Befehls '$ python manage.py migrate' behoben werden.
Viel Spaß beim Codieren!
quelle
python manage.py migrate <app>
... für alle meine Apps.django-south
- dermigrate
Befehl ist nicht in Django integriert.In Flask müssen Sie nur schreiben:
Die PS-Dokumentation finden Sie hier https://www.postgresql.org/docs/9.4/static/sql-rollback.html
quelle
Nach meiner Erfahrung treten diese Fehler folgendermaßen auf:
An der zweiten Abfrage ist nichts auszusetzen, aber da der eigentliche Fehler abgefangen wurde, ist die zweite Abfrage diejenige, die den (viel weniger informativen) Fehler auslöst.
Bearbeiten: Dies geschieht nur, wenn die
except
Klausel abfängtIntegrityError
(oder eine andere Datenbankausnahme auf niedriger Ebene). Wenn Sie so etwas abfangen, wirdDoesNotExist
dieser Fehler nicht angezeigt, daDoesNotExist
die Transaktion nicht beschädigt wird.Die Lektion hier ist, nicht zu versuchen / außer / zu bestehen.
quelle
Ich denke, dass die von Priestc erwähnten Muster eher die übliche Ursache für dieses Problem sind, wenn PostgreSQL verwendet wird.
Ich bin jedoch der Meinung, dass es gültige Verwendungen für das Muster gibt, und ich denke nicht, dass dieses Problem ein Grund sein sollte, es immer zu vermeiden. Beispielsweise:
Wenn Sie mit diesem Muster einverstanden sind, aber überall expliziten Code für die Transaktionsverarbeitung vermeiden möchten, sollten Sie den Autocommit-Modus (PostgreSQL 8.2+) aktivieren: https://docs.djangoproject.com/en/ dev / ref / database / # autocommit-mode
Ich bin mir nicht sicher, ob es wichtige Leistungsaspekte gibt (oder von irgendeiner anderen Art).
quelle
Wenn Sie dies in einer interaktiven Shell erhalten und eine schnelle Lösung benötigen, gehen Sie folgendermaßen vor:
ursprünglich in dieser Antwort gesehen
quelle
Beim Ausführen einer fehlerhaften Transaktion auf dem
postgres
Terminal ist ein ähnliches Verhalten aufgetreten . Danach ging nichts mehr durch, da sich dasdatabase
in einem Zustand von befindeterror
. Allerdings nur als schnelle Lösung, wenn Sie es sich leisten können, zu vermeidenrollback transaction
. Folgendes hat den Trick für mich getan:COMMIT;
quelle
Ich habe das Silimar-Problem. Die Lösung bestand darin, db zu migrieren (
manage.py syncdb
odermanage.py schemamigration --auto <table name>
wenn Sie South verwenden).quelle
Verwenden Sie einfach Rollback
Beispielcode
quelle
Ich hatte gerade auch diesen Fehler, aber er maskierte eine andere relevantere Fehlermeldung, bei der der Code versuchte, eine 125-Zeichen-Zeichenfolge in einer 100-Zeichen-Spalte zu speichern:
Ich musste den Code debuggen, damit die obige Nachricht angezeigt wurde, sonst wird sie angezeigt
quelle
Was ist, wenn Sie als Antwort auf @priestc und @Sebastian so etwas tun?
Ich habe gerade diesen Code ausprobiert und er scheint zu funktionieren, schlägt stillschweigend fehl, ohne sich um mögliche Fehler kümmern zu müssen, und funktioniert, wenn die Abfrage gut ist.
quelle
Ich glaube, dass die Antwort von @ AnujGupta richtig ist. Der Rollback kann jedoch selbst eine Ausnahme auslösen, die Sie abfangen und behandeln sollten:
Wenn Sie feststellen, dass Sie diesen Code an verschiedenen
save()
Stellen neu schreiben , können Sie die folgende Extraktionsmethode verwenden:Schließlich können Sie es mit einem Dekorateur verschönern, der Methoden schützt, die Folgendes verwenden
save()
:Selbst wenn Sie den obigen Dekorator implementieren, ist es dennoch praktisch, ihn
try_rolling_back()
als extrahierte Methode beizubehalten, falls Sie ihn manuell verwenden müssen, wenn eine bestimmte Behandlung erforderlich ist und die generische Behandlung des Dekorators nicht ausreicht.quelle
Das ist ein sehr seltsames Verhalten für mich. Ich bin überrascht, dass niemand an Sicherungspunkte gedacht hat. In meinem Code fehlgeschlagene Abfrage wurde Verhalten erwartet:
Ich habe den Code auf diese Weise geändert, um Sicherungspunkte zu verwenden:
quelle
In Flask Shell musste ich nur daran
session.rollback()
vorbeikommen.quelle
Ich habe dieses Problem festgestellt. Der Fehler tritt auf, da die Fehlertransaktionen nicht ordnungsgemäß beendet wurden. Ich habe hier den
postgresql_transactions
Befehl Transaktionssteuerung gefundenTransaktionskontrolle
Die folgenden Befehle werden zur Steuerung von Transaktionen verwendet
Also benutze ich den
END TRANSACTION
, um den Fehler TRANSACTION zu beenden, Code wie folgt:quelle
Sie können die Transaktion über "set_isolation_level (0)" deaktivieren.
quelle