首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres: cursor.execute("COMMIT")与connection.commit()

Postgres: cursor.execute("COMMIT")与connection.commit()
EN

Stack Overflow用户
提问于 2014-05-06 21:45:54
回答 1查看 4.3K关注 0票数 6

我运行的是postgres 9.2服务器,并且有一个python客户端使用的是client 2.5。

我运行了一些测试,因为我在日志文件中遇到了很多WARNING: there is no transaction in progress条目。

我有一些代码可以简化为以下代码:

代码语言:javascript
复制
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的内部有关?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2014-05-06 23:38:27

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23496497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档