【问题标题】:How do you rollback during Django shell session after causing DatabaseError?导致 DatabaseError 后如何在 Django shell 会话期间回滚?
【发布时间】:2011-09-02 18:11:41
【问题描述】:

我以前知道怎么做,但我忘记了。有时,在使用 Django shell 时,您犯了一个错误并导致事务中止。之后,您执行的任何进一步查询都将导致 DatabaseError: current transaction is aborted,命令被忽略,直到事务块结束。但是,我认为有一种方法可以在手动发生这种情况时回滚事务,这样您就不必重新启动会话。谁能告诉我这是什么?

这个错误报告 (https://code.djangoproject.com/ticket/10813) 提到了该技​​术,但没有解释它。运行 django.db.transaction.rollback 会导致“TransactionManagementError: This code is not under transaction management”。

【问题讨论】:

    标签: django


    【解决方案1】:

    我在使用 Postgres 时经常遇到这种情况,真的很烦人。

    你想要:

    from django.db import transaction
    transaction.rollback()
    

    大多数时候这很好(根据我的经验,忽略TransactionManagementError 是安全的)。

    【讨论】:

    • 谢谢。我还开始从一开始就将我的会话置于事务管理之下。无论如何,让事情变得更安全。
    【解决方案2】:

    这稍微好一些,因为您没有得到关于 TransactionManagementError 的堆栈跟踪:

    from django.db import transaction
    transaction.rollback_unless_managed()
    

    【讨论】:

    • 谢谢!我在 signals.py 中加载了一些代码,它在 syncdb 发生之前引用了 ORM .get(),这就是我需要的创可贴。 (你知道,而不是实际修复我的代码来完全避免数据库查询!)
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 2021-09-02
    • 2012-04-18
    • 2013-09-16
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多