【问题标题】:Django+Postgres: "current transaction is aborted, commands ignored until end of transaction block"Django + Postgres:“当前事务被中止,命令被忽略,直到事务块结束”
【发布时间】:2011-12-06 20:53:09
【问题描述】:

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

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

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

(我已经阅读了 thisthis,但它们没有给出可操作的说明来说明如何从 shell 中执行操作。)

【问题讨论】:

  • 我以前遇到过这个问题,但找不到解决办法...
  • this 的潜在副本,它提供了几乎相同的公认解决方案...

标签: django postgresql


【解决方案1】:

你可以试试这个:

from django.db import connection
connection._rollback()

This issue can be found here的更详细讨论

【讨论】:

  • 这个解决方案对我不起作用。即使回滚事务,我也无法再与数据库进行 任何 交互。我找到了另一种解决方法,请参阅我的答案。
  • 还有 connection.close() 如果 _rollback 不适合你 (@ifischer)
【解决方案2】:

将备份还原到完全空的数据库后,我遇到了这个错误。跑完就走了:

./manage syncdb 

也许转储中缺少一些内部模型...

【讨论】:

    【解决方案3】:

    这有时发生在我身上,通常是失踪

    manage.py migrate 
    

    manage.py syncdb
    

    这里也提到了

    如果您的models.py 中有一个未决的架构迁移,它也可能以相反的方式发生。对于 south,您需要更新架构。

    manage.py schemamigration mymodel --auto
    

    【讨论】:

      【解决方案4】:

      警告:下面的补丁可能会导致事务在数据库上处于打开状态(至少对于 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
      

      【讨论】:

      • 如果有人感兴趣:我扩展了 django-extensions shell-plus 命令,以便能够在启动时加载文件,其中我除了包括这个补丁在内的其他东西。 github.com/ifischer/django-extensions
      • 这肯定会让连接保持打开状态,因为django.db.close_connection 是一个函数,如果你想让它做任何事情,需要用() 调用;)我也经常做一个django.db.connection.close() 这可能别名close_connection,不知道。
      【解决方案5】:

      Check this

      快速的答案通常是通过添加以下内容来打开数据库级别的自动提交:

      'OPTIONS': {'autocommit': True,}
      

      到数据库设置。

      【讨论】:

      • 在哪里?你在哪里添加这个?
      • 在设置文件中,在 DATABASES 字典中:docs.djangoproject.com/en/dev/ref/settings/#autocommit.
      • 此信息似乎已过时。来自文档:“Django 的默认行为是以自动提交模式运行......出于性能原因,Django 的 TestCase 类还将每个测试包装在事务中。”
      【解决方案6】:

      如果您在运行migrate (South) 时碰巧遇到这样的错误,则可能是您在数据库架构中进行了很多更改,并且想要一次处理所有这些更改。 Postgres 对此有点讨厌。始终有效的方法是将一次大迁移分解为更小的步骤。很可能,您使用的是版本控制系统。

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

      因此,遇到上述情况,请执行以下操作:

      • 将存储库签出到“n4”,然后进行同步数据库并迁移。
      • 将存储库签出到“n7”,然后进行同步数据库并迁移。
      • 将存储库签出到“n10”,然后进行同步数据库并迁移。

      你就完成了。 :)

      它应该可以完美运行。

      【讨论】:

        【解决方案7】:

        如果您使用的是 1.6 之前的 django 版本,那么您应该使用 Christophe 出色的 xact 模块。

        xact 是在 PostgreSQL 上的 Django 应用程序中明智地处理事务的方法。

        注意: 从 Django 1.6 开始,xact 的功能将作为原子装饰器合并到 Django 核心中。使用 xact 的代码应该能够通过搜索和替换迁移到原子。 atomic 适用于 PostgreSQL 以外的数据库,是线程安全的,并且具有其他不错的功能;尽可能切换到它!

        【讨论】:

          【解决方案8】:

          我将以下内容添加到我的设置文件中,因为我喜欢“玩耍”时的自动提交功能,但不希望在我的网站运行时激活它。

          所以要在 shell 中自动提交,我做了这个小技巧:

          import sys
          if 'shell' in sys.argv or sys.argv[0].endswith('pydevconsole.py'):
              DATABASES['default']['OPTIONS']['autocommit'] = True
          

          注意:第二部分只是因为我在 PyCharm 中工作,它不直接运行 manage.py

          【讨论】:

            【解决方案9】:

            我在 Django 1.7 中遇到了这个错误。当我在the documentation 中看到

            在Django的默认模式和atomic()下不会出现这个问题 自动处理。

            我有点怀疑。当我尝试运行迁移时,错误发生了。原来我的一些模型有my_field = MyField(default=some_function)。将此函数作为字段的默认值适用于 sqlite 和 mysql(我有一些导入错误,但我设法使它工作),虽然它似乎不适用于 postgresql,它破坏了迁移到我事件没有收到有用的错误消息,而是来自问题标题的错误消息。

            【讨论】:

            • 有点死灵贴,但我遇到了这个确切的问题。你解决了吗?
            • 此时无法回忆。我最好的建议是将迁移步骤拆分为多个迁移文件,看看是否有帮助。架构更改和数据更改不能与 postgres 在同一个迁移文件中
            • 谢谢!事实证明,Django 正在吞噬我最终通过 pdb 看到的错误。根据错误,我通过在依赖项列表中添加一些额外的项目来解决问题。
            【解决方案10】:

            对我来说,这是一个没有迁移的测试数据库。我使用--keepdb 进行测试。在没有它的情况下运行一次即可修复错误。

            【讨论】:

              猜你喜欢
              • 2013-08-04
              • 2013-10-25
              • 1970-01-01
              • 2014-07-04
              • 2011-01-13
              • 2012-05-11
              • 2016-12-11
              • 1970-01-01
              • 2011-04-05
              相关资源
              最近更新 更多