我已经开始在Django / Postgres网站上工作了。有时我在manage.py shell
工作,不小心做了一些导致错误的数据库操作。然后我根本无法执行任何数据库操作,因为对于我尝试执行的任何数据库操作,我收到错误:
current transaction is aborted, commands ignored until end of transaction block
我目前的解决方法是重新启动shell,但我应该找到一种方法来解决这个问题而不放弃我的shell会话。
答案 0 :(得分:111)
你可以试试这个:
from django.db import connection
connection._rollback()
的更详细讨论
答案 1 :(得分:25)
有时这种情况发生在我身上,往往是缺失的
manage.py migrate
或
manage.py syncdb
如此处所述
如果你的models.py中有一个schemamigration等待,那么反过来也会发生这种情况。在南方,您需要使用。更新架构manage.py schemamigration mymodel --auto
答案 2 :(得分:13)
答案 3 :(得分:3)
将备份恢复到完全空的DB后,我遇到了这个错误。它在跑完后就消失了:
./manage syncdb
也许转储中缺少一些内部模型......
答案 4 :(得分:2)
警告:下面的补丁可能会导致事务在db上处于打开状态(至少使用postgres)。不是100%肯定(以及如何修复),但我强烈建议不要在生产数据库上进行以下补丁。
由于接受的答案无法解决我的问题 - 一旦出现任何数据库错误,即使手动回滚,我也无法执行任何新的数据库操作 - 我想出了自己的解决方案。
当我运行Django-shell时,我会在发生任何错误时立即修补Django以关闭数据库连接。这样我就不必考虑回滚事务或处理连接。
这是我在Django-shell-session开始时加载的代码:
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
答案 5 :(得分:0)
如果您在运行migrate
(南方)时遇到这样的错误,可能是您在数据库架构中有很多更改并希望一次处理所有这些更改。 Postgres对此有点讨厌。总是有效的是将一个大的迁移分解成更小的步骤。最有可能的是,您正在使用版本控制系统。
因此,如上所述,请执行以下操作:
你已经完成了。 :)
它应该完美运行。
答案 6 :(得分:0)
如果您在1.6之前使用django版本,那么您应该使用Christophe的优秀xact模块。
xact 是在PostgreSQL上处理Django应用程序中的交易的秘诀。
注意:从Django 1.6开始,xact的功能将作为原子装饰器合并到Django核心中。使用xact的代码应该能够通过搜索和替换迁移到原子。原子在PostgreSQL之外的数据库上运行,是线程安全的,并且具有其他不错的功能;你可以切换到它!
答案 7 :(得分:0)
我将以下内容添加到我的设置文件中,因为我喜欢自动提交功能,因为我在玩#34;但是当我的网站以其他方式运行时,不希望它处于活动状态。
所以为了在shell中进行自动提交,我会做这个小小的黑客攻击:
import sys
if 'shell' in sys.argv or sys.argv[0].endswith('pydevconsole.py'):
DATABASES['default']['OPTIONS']['autocommit'] = True
注意:第二部分是因为我在PyCharm中工作,它不直接运行manage.py
答案 8 :(得分:0)
我在Django 1.7中遇到此错误。当我在the documentation读到
时在Django的默认模式和atomic()中不会发生此问题 自动处理它。
我有点怀疑。当我尝试运行迁移时,错误发生了。事实证明我的一些模型有my_field = MyField(default=some_function)
。将此功能作为字段的默认设置,使用sqlite和mysql(我有一些导入错误,但我设法使其工作),虽然它似乎不适用于postgresql,它打破了迁移到我的点没有事件得到有用的错误信息,而是问题标题中的那个。
答案 9 :(得分:0)
对我来说,这是一个没有迁移的测试数据库。我使用 --keepdb
进行测试。在没有它的情况下运行一次它修复了错误。