ВНИМАНИЕ: приведенный ниже патч может привести к тому, что транзакции останутся в открытом состоянии на БД (по крайней мере, с postgres). Не уверен на 100% в этом (и как это исправить), но я настоятельно рекомендую не делать приведенный ниже патч для рабочих баз данных.
Поскольку принятый ответ не решает мои проблемы - как только я получаю какую-либо ошибку БД, я не могу выполнять никаких новых действий с БД, даже с ручным откатом, - я придумал свое собственное решение.
Когда я запускаю оболочку Django, я исправляю Django, чтобы закрыть соединение с БД, как только возникнут какие-либо ошибки. Таким образом, мне никогда не придется думать об откате транзакций или обработке соединения.
Это код, который я загружаю в начале моей сессии Django-shell:
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