我正在运行一个postgres 9.2服务器,并使用psycopg 2.5进行python客户端。
我运行了一些测试,因为我在日志文件中遇到了很多WARNING: there is no transaction in progress
个条目。
我有一些代码可以简化为以下内容:
import psycopg2
connection = psycopg2.connect(...)
with connection.cursor() as cursor:
# Multiple insert statements
cursor.execute("INSERT INTO ...")
cursor.execute("COMMIT")
我发现如果我执行以下操作,只要第一个COMMIT
运行(我重复使用相同的连接,以便上面的代码多次运行),之后的每个语句都会立即提交。但是,如果我改为运行connection.commit()
它按预期工作(到目前为止提交的语句,将来的语句不会自动提交)。
这是一个错误还是有一些很好的区别我错过了它的工作方式?这是一个postgres问题还是与psycopg2的内脏有关?
提前致谢!
答案 0 :(得分:1)
是的,有一个不太好的区别(在DBAPI PEP和psycopg文档中都有记录)。当通过连接发出第一个SQL语句时,所有兼容Python DBAPI的适配器都会隐式启动事务。那么你不应该直接执行回滚/提交,而是使用connection
对象上可用的方法。
如果你想进行自己的事务管理,只需将连接置于自动提交模式,然后发送自己的BEGIN,然后发送其他语句,并以通常的COMMIT或ROLLBACK结束。