Django + Postgres:“当前事务被中止,命令被忽略,直到事务块结束”

时间:2011-10-13 10:53:37

标签: django postgresql

我已经开始在Django / Postgres网站上工作了。有时我在manage.py shell工作,不小心做了一些导致错误的数据库操作。然后我根本无法执行任何数据库操作,因为对于我尝试执行的任何数据库操作,我收到错误:

current transaction is aborted, commands ignored until end of transaction block

我目前的解决方法是重新启动shell,但我应该找到一种方法来解决这个问题而不放弃我的shell会话。

(我已阅读thisthis,但他们没有就shell的操作提供可操作的说明。)

10 个答案:

答案 0 :(得分:111)

你可以试试这个:

from django.db import connection
connection._rollback()

This issue can be found here

的更详细讨论

答案 1 :(得分:25)

有时这种情况发生在我身上,往往是缺失的

manage.py migrate 

manage.py syncdb

如此处所述

如果你的models.py中有一个schemamigration等待,那么反过来也会发生这种情况。在南方,您需要使用。

更新架构
manage.py schemamigration mymodel --auto

答案 2 :(得分:13)

Check this

快速回答通常是通过添加:

打开数据库级自动提交
'OPTIONS': {'autocommit': True,}

到数据库设置。

答案 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对此有点讨厌。总是有效的是将一个大的迁移分解成更小的步骤。最有可能的是,您正在使用版本控制系统。

  • 您当前的版本
  • 提交n1
  • 提交n2
  • 提交n3
  • 提交n4 #db更改
  • 提交n5
  • 提交n6
  • 提交n7 #db changse
  • 提交n8
  • 提交n9 #db更改
  • 提交n10

因此,如上所述,请执行以下操作:

  • 结帐存储库为“n4”,然后是syncdb并迁移。
  • 结帐存储库为“n7”,然后是syncdb并迁移。
  • 结帐存储库为“n10”,然后是syncdb并迁移。

你已经完成了。 :)

它应该完美运行。

答案 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 进行测试。在没有它的情况下运行一次它修复了错误。