警告:以下补丁可能会导致事务在数据库上处于打开状态(至少在使用postgres的情况下)。不能100%地确定这一点(以及如何解决),但是我强烈建议不要在生产数据库上进行以下修补程序。
由于可接受的答案不能解决我的问题-出现任何数据库错误后,即使进行了手动回滚,我也无法执行任何新的数据库操作-我想出了自己的解决方案。
当我运行Django-shell时,我会修补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