数据库错误:当前事务已中止,命令在事务块结束前被忽略?

362 投票
21 回答
371341 浏览
提问于 2025-04-15 23:35

我遇到了很多错误,错误信息是:

“数据库错误:当前事务已经中止,直到事务结束之前的命令都会被忽略”

这个问题发生在我把Django项目的数据库引擎从python-psycopg换成python-psycopg2之后。

代码没有变,只是不知道这些错误是从哪里来的。

21 个回答

90

在Flask中,你只需要写:

curs = conn.cursor()
curs.execute("ROLLBACK")
conn.commit()

附注:文档在这里 https://www.postgresql.org/docs/9.4/static/sql-rollback.html

151

要解决这个错误,在你修复了代码后,撤销上一个(出错的)操作

from django.db import transaction
transaction.rollback()

你可以使用try-except来防止错误发生:

from django.db import transaction, DatabaseError
try:
    a.save()
except DatabaseError:
    transaction.rollback()

参考:Django文档

261

当你在Postgres数据库中执行一个查询时,如果这个查询出错了,而你又想继续执行另一个查询,但没有先撤销之前的操作,Postgres会采取一些措施。这可以看作是一种保护机制,目的是为了防止你的数据被损坏。

要解决这个问题,你需要找出代码中哪个地方执行了那个出错的查询。使用Postgres服务器中的log_statementlog_min_error_statement选项可能会对你有所帮助。

撰写回答