Postgres:cursor.execute(“COMMIT”)与connection.commit()

时间:2014-05-06 13:45:54

标签: python postgresql transactions psycopg2

我正在运行一个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的内脏有关?

提前致谢!

1 个答案:

答案 0 :(得分:1)

是的,有一个不太好的区别(在DBAPI PEP和psycopg文档中都有记录)。当通过连接发出第一个SQL语句时,所有兼容Python DBAPI的适配器都会隐式启动事务。那么你不应该直接执行回滚/提交,而是使用connection对象上可用的方法。

如果你想进行自己的事务管理,只需将连接置于自动提交模式,然后发送自己的BEGIN,然后发送其他语句,并以通常的COMMIT或ROLLBACK结束。