Python SQLite - 如何手动BEGIN和END事务?

时间:2014-06-23 19:55:34

标签: python sqlite transactions

上下文

所以我试图弄清楚在Python中使用SQLite时如何正确覆盖自动事务。当我尝试运行时

cursor.execute("BEGIN;")
.....an assortment of insert statements...
cursor.execute("END;")

我收到以下错误:

OperationalError: cannot commit - no transaction is active

我理解的是因为Python中的SQLite会自动在每个修改语句上打开一个事务,在这种情况下是一个INSERT。

问题:

我试图通过每几千条记录执行一次交易来加快插入速度。 如何克服自动开启交易?

2 个答案:

答案 0 :(得分:8)

作为@CL。说你必须将隔离级别设置为None。代码示例:

s = sqlite3.connect("./data.db")
s.isolation_level = None

try:
    c = s.cursor()
    c.execute("begin")
    ...
    c.execute("commit")
except:
    c.execute("rollback")

答案 1 :(得分:3)

documentaton说:

  

您可以通过 isolation_level 参数到connect()调用或通过 isolation_level <控制sqlite3隐式执行哪种BEGIN语句(或根本不执行) / em>连接属性。

     

如果您想要自动提交模式,请将 isolation_level 设置为None