在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
?!
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块不会关闭连接,只会关闭与之相关的事务。