我在阅读 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"
a
,b
的数据操作会丢失。
但是正如我所看到的,PostgreSQL上并没有发生这种情况。我肯定在这里遗漏了一些东西,但现在我不知道在哪里和哪里。
答案 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")