在SELECT语句中遇到错误后需要提交(或回滚)



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

make connection with 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()打开TRANSACTION?甚至是SELECT?!

在select查询中是否可以避免startTRANSACTION?

tank from @snakecharmerb for comment

:

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

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

solution1:

connection.autocommit = True

solution2:

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

如果该块没有引发异常,则事务提交。在异常情况下,事务回滚。

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