繁体   English   中英

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

[英]Postgres: cursor.execute(“COMMIT”) vs. connection.commit()

我正在运行一个postgres 9.2服务器,并使用psycopg 2.5有一个python客户端。

我运行了一些测试,因为我经历了很多WARNING: there is no transaction in progress我的日志文件中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的内脏有关?

提前致谢!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM