psycopg2中的事务支持

时间:2017-12-15 13:49:57

标签: postgresql psycopg2

我在阅读 psycopg2 文档时有点困惑,关于它如何处理事务(除了使用with语句之外)。

通过docs阅读,我看到了

  

默认情况下,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上并没有发生这种情况。我肯定在这里遗漏了一些东西,但现在我不知道在哪里和哪里。

2 个答案:

答案 0 :(得分:1)

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

警告是在未启动任何显式事务(默认情况下PostgreSQL处于自动提交模式!)下发出COMMIT时得到的警告。

使用类似

的语句
print(dbconn.autocommit)

确认已启用自动提交。

要更改属性,只需使用

dbconn.autocommit = False

答案 1 :(得分:0)

如果您不想像Laurenz建议的那样关闭自动提交模式,也可以显式启动事务:

cursor.execute("begin")
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")