我运行的是postgres 9.2服务器,并且有一个python客户端使用的是client 2.5。
我运行了一些测试,因为我在日志文件中遇到了很多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(),它就会像预期的那样工作(到目前为止提交的语句,将来的语句将不会自动提交)。
这是一个bug,还是我在它的工作方式中遗漏了一些细微的区别?这是postgres的问题还是与psycopg2的内部有关?
提前感谢!
发布于 2014-05-06 23:38:27
是的,有一个不那么细微的区别(在DBAPI PEP和psycopg文档中都有记录)。当通过连接发出第一条SQL语句时,所有与Python DBAPI兼容的适配器都会隐式启动一个事务。那么您就不应该直接执行回滚/提交,而应该使用connection对象上可用的方法。
如果您想进行自己的事务管理,只需将连接置于自动提交模式,然后发送您自己的BEGIN,然后发送其他语句,并以通常的COMMIT或ROLLBACK结束。
https://stackoverflow.com/questions/23496497
复制相似问题