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:
from django import db
from django.db.backends.util import CursorDebugWrapper
old_execute = CursorDebugWrapper.execute
old_execute_many = CursorDebugWrapper.executemany
def execute_wrapper(*args, **kwargs):
try:
old_execute(*args, **kwargs)
except Exception, ex:
logger.error("Database error:\n%s" % ex)
db.close_connection
def execute_many_wrapper(*args, **kwargs):
try:
old_execute_many(*args, **kwargs)
except Exception, ex:
logger.error("Database error:\n%s" % ex)
db.close_connection
CursorDebugWrapper.execute = execute_wrapper
CursorDebugWrapper.executemany = execute_many_wrapper