首页 > 解决方案 > SELECT 语句遇到错误后需要提交(或回滚)

问题描述

SELECT当遇到语句错误时,显然TRANSACTION保持打开状态。

与 psycopg 建立联系:

# ...
connection.autocommit = False
cur = connection.cursor(cursor_factory=DictCursor)

选择不存在的表:

cur.execute('SELECT * FROM "non_exists_table"') # a incorrect query
psycopg2.errors.UndefinedTable: relation "non_exists_table" does not exist

然后执行另一个查询:

cur.execute('SELECT * FROM "exists_table"') # this is a correct query
psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block

为什么?

是否为所有人psycopg2打开交易execute()?甚至SELECT?!!

是否可以避免在选择查询中启动TRANSACTION ?

标签: pythonpostgresqlpsycopg2

解决方案


来自@snakecharmerb的坦克征求意见

通过这个参考:

默认情况下,第一次将命令发送到数据库(使用连接创建的游标之一)时,会创建一个新事务。

如果任何命令失败,事务将被中止并且在调用 rollback() 方法之前不会执行进一步的命令。

解决方案1:

connection.autocommit = True

解决方案2:

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)

如果块没有引发异常,则提交事务。如果出现异常,事务将回滚。

与文件对象或其他资源不同,退出连接的 with 块不会关闭连接,而只会关闭与其关联的事务。


推荐阅读