Ich habe angefangen, an einer Django / Postgres-Site zu arbeiten. Manchmal arbeite ich in manage.py shell
und führe versehentlich eine DB-Aktion aus, die zu einem Fehler führt. Dann kann ich überhaupt keine Datenbankaktion ausführen, da bei jeder Datenbankaktion, die ich versuche, folgende Fehlermeldung angezeigt wird:
current transaction is aborted, commands ignored until end of transaction block
Meine derzeitige Problemumgehung besteht darin, die Shell neu zu starten, aber ich sollte einen Weg finden, dies zu beheben, ohne meine Shell-Sitzung abzubrechen.
(Ich habe dies und das gelesen , aber sie geben keine umsetzbaren Anweisungen, was mit der Shell zu tun ist.)
django
postgresql
Ram Rachum
quelle
quelle
Antworten:
Sie können dies versuchen:
Die ausführlichere Diskussion dieses Problems finden Sie hier
quelle
connection.close()
wenn _rollback es nicht für Sie tut (@ifischer)das passiert mir manchmal, oft fehlt es
oder
wie auch hier erwähnt
Dies kann auch umgekehrt geschehen, wenn für Ihre models.py eine Schema-Migration ansteht. Mit South müssen Sie das Schema mit aktualisieren.
manage.py schemamigration mymodel --auto
quelle
Überprüfen Sie dies
Die schnelle Antwort besteht normalerweise darin, das Autocommit auf Datenbankebene zu aktivieren, indem Sie Folgendes hinzufügen:
Zu den Datenbankeinstellungen.
quelle
Ich hatte diesen Fehler, nachdem ich ein Backup in einer völlig leeren Datenbank wiederhergestellt hatte. Es ging nach dem Laufen weg:
Vielleicht fehlten einige interne Modelle auf der Müllkippe ...
quelle
WARNUNG: Der folgende Patch kann möglicherweise dazu führen, dass Transaktionen in der Datenbank offen bleiben (zumindest mit Postgres). Ich bin mir nicht 100% sicher (und wie man das behebt), aber ich empfehle dringend, den folgenden Patch nicht in Produktionsdatenbanken auszuführen.
Da die akzeptierte Antwort meine Probleme nicht löst - sobald ich einen DB-Fehler erhalte, kann ich auch bei einem manuellen Rollback keine neuen DB-Aktionen ausführen - habe ich meine eigene Lösung gefunden.
Wenn ich die Django-Shell ausführe, patche ich Django, um die DB-Verbindung zu schließen, sobald Fehler auftreten. Auf diese Weise muss ich nie daran denken, Transaktionen zurückzusetzen oder die Verbindung zu verwalten.
Dies ist der Code, den ich zu Beginn meiner Django-Shell-Sitzung lade:
quelle
django.db.close_connection
es sich um eine Funktion handelt, mit der aufgerufen werden muss,()
wenn Sie möchten, dass sie etwasdjango.db.connection.close()
bewirkt ;) Ich mache auch oft eine, die möglicherweise von Alias geprägt istclose_connection
, weiß nicht.Wenn beim Ausführen von
migrate
(South) ein solcher Fehler auftritt , kann es sein, dass Sie viele Änderungen am Datenbankschema vorgenommen haben und alle gleichzeitig behandeln möchten. Postgres ist ein bisschen böse. Was immer funktioniert, ist, eine große Migration in kleinere Schritte zu unterteilen. Höchstwahrscheinlich verwenden Sie ein Versionskontrollsystem.Gehen Sie in der oben beschriebenen Situation wie folgt vor:
Und du bist fertig. :) :)
Es sollte einwandfrei laufen.
quelle
Wenn Sie eine Django-Version vor 1.6 verwenden, sollten Sie das hervorragende xact- Modul von Christophe verwenden .
xact ist ein Rezept für einen vernünftigen Umgang mit Transaktionen in Django-Anwendungen unter PostgreSQL.
Hinweis: Ab Django 1.6 wird die Funktionalität von xact als atomarer Dekorateur in den Django-Kern integriert. Code, der xact verwendet, sollte mit nur einem Suchen und Ersetzen auf atomar migriert werden können. Atomic arbeitet mit anderen Datenbanken als PostgreSQL, ist threadsicher und verfügt über andere nützliche Funktionen. wechsle dorthin, wenn du kannst!
quelle
Ich füge meiner Einstellungsdatei Folgendes hinzu, weil mir die Autocommit-Funktion gefällt, wenn ich "herumspiele", aber nicht möchte, dass sie aktiv ist, wenn meine Site anderweitig ausgeführt wird.
Um Autocommit nur in der Shell zu bekommen, mache ich diesen kleinen Hack:
HINWEIS: Dieser zweite Teil ist nur deshalb so, weil ich in PyCharm arbeite, auf dem manage.py nicht direkt ausgeführt wird
quelle
Ich habe diesen Fehler in Django 1.7 erhalten. Wenn ich in der Dokumentation das lese
Ich wurde ein bisschen misstrauisch. Die Fehler traten auf, als ich versuchte, Migrationen auszuführen. Es stellte sich heraus, dass einige meiner Modelle hatten
my_field = MyField(default=some_function)
. Diese Funktion als Standard für ein Feld zu haben, funktionierte einwandfrei mit SQLite und MySQL (ich hatte einige Importfehler, aber ich habe es geschafft, dass es funktioniert), obwohl es für PostgresQL nicht zu funktionieren scheint, und es hat die Migrationen bis zu dem Punkt unterbrochen, an dem ich Das Ereignis hat keine hilfreiche Fehlermeldung erhalten, sondern die aus dem Fragentitel.quelle