Psycopg2中的事务支持

5
我对阅读psycopg2文档在处理事务方面有些困惑(除了使用with语句)。通过阅读文档,我发现默认情况下Psycopg会在执行第一条命令前开启一个事务:如果不调用commit(),任何数据操作的效果都将丢失。假设以上声明是正确的。
dbconn = psycopg2.connect(...)   cursor = dbconn.cursor()
cursor.execute("insert record into a") 
cursor.execute("insert record into b")

cursor.execute("insert record into c") // This throw integrity error.
cursor.execute("commit") // this logs "WARNING:  there is no transaction in progress"

ab的数据操作可能会丢失

但在我看来,PostgreSQL并没有发生这种情况。我肯定是在某些方面遗漏了什么,但现在我不确定是什么以及在哪里出了问题。


你在postgresql上看不到什么?发生了什么事情?根据你的代码,我很难确定错误是你预期的还是没有预期的,提交也是一样。 - Kamil Gosciminski
@KamilGosciminski 抱歉,我不记得了。我不小心将这个问题作为反对另一个问题的赏金提出了。 - Noobie
@KamilGosciminski 但您仍然可以回答这个问题..我想要解决的问题是,如果在第一条语句中打开了 psycopg2 的事务,则 commit 语句不会出现警告,即 "WARNING:未启动任何事务" - Noobie
1个回答

4

你必须处于自动提交模式。

如果没有启动显式事务(PostgreSQL默认情况下为自动提交模式!),在发出COMMIT命令时会收到此警告。

可以使用类似以下的语句:

print(dbconn.autocommit)

验证自动提交是否已启用。

要更改该属性,只需使用

dbconn.autocommit = False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接