connection.close()
(@ifischer)。 - hobs有时候我也会遇到这种情况,通常是因为缺少了一个闭合标签
manage.py migrate
或者manage.py syncdb
如此也可以发生反过来的情况,如果你的models.py中存在一个待处理的schemamigration。使用south时,你需要通过以下方式更新模式:
manage.py schemamigration mymodel --auto
警告:以下补丁可能会导致数据库中的事务处于打开状态(至少在postgres中是如此)。我不确定这一点(以及如何修复),但我强烈建议不要在生产数据库上执行以下补丁。
由于被接受的答案不能解决我的问题-一旦我遇到任何数据库错误,我就无法进行任何新的数据库操作,即使手动回滚-所以我想出了自己的解决方案。
当我运行Django-shell时,我会对Django进行补丁,以便在发生任何错误时立即关闭DB连接。这样我就不必考虑回滚事务或处理连接的问题。
这是我在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
django.db.close_connection
是一个函数,如果你想让它做任何事情,就需要用()
调用它;) 我经常使用django.db.connection.close()
,可能会被别名为close_connection
,不确定。 - hobs我在将备份还原到完全空的数据库后遇到了这个错误。运行以下命令后错误消失了:
./manage syncdb
--keepdb
。运行一次没有使用它就解决了错误。import sys
if 'shell' in sys.argv or sys.argv[0].endswith('pydevconsole.py'):
DATABASES['default']['OPTIONS']['autocommit'] = True
注意:第二部分是因为我使用PyCharm工作,它不能直接运行manage.py文件。
python manage.py migrate
(或python3 manage.py migrate
)来解决它。如果在运行migrate
(South)时遇到此类错误,可能是因为您的数据库模式中有很多更改,并且希望一次性处理它们。Postgres对此有点讨厌。始终有效的方法是将一个大型迁移拆分为较小的步骤。最有可能的是,您正在使用版本控制系统。
因此,针对上述情况,请按照以下步骤操作:
然后你就完成了。 :)
它应该无缝运行。