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

Per*_*Man -2 python postgresql psycopg2

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

与 psycopg 建立联系:

# ...
connection.autocommit = False
cur = connection.cursor(cursor_factory=DictCursor)
Run Code Online (Sandbox Code Playgroud)

选择不存在的表:

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

然后执行另一个查询:

psycopg2.errors.UndefinedTable: relation "non_exists_table" does not exist
Run Code Online (Sandbox Code Playgroud)
psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block
Run Code Online (Sandbox Code Playgroud)

为什么?

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

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

Per*_*Man 5

来自@snakecharmerb的坦克征求意见

\n

通过这个参考:

\n
\n

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

\n
\n
\n

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

\n
\n

解决方案1:

\n
connection.autocommit = True\n
Run Code Online (Sandbox Code Playgroud)\n

解决方案2:

\n
with psycopg2.connect(DSN) as conn:\n    with conn.cursor() as curs:\n        curs.execute(SQL)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n