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

Geo*_*lov 3 python sqlite transactions

上下文

因此,我试图弄清楚在Python中使用SQLite时如何正确覆盖自动事务.当我试着跑

cursor.execute("BEGIN;")
.....an assortment of insert statements...
cursor.execute("END;")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

OperationalError: cannot commit - no transaction is active
Run Code Online (Sandbox Code Playgroud)

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

题:

我试图通过每几千条记录做一次交易来加快我的插入速度. 如何克服交易的自动开放?

pan*_*kes 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")
Run Code Online (Sandbox Code Playgroud)

  • 我有一个关于这个语句的问题:"如果你想要自动提交模式,那么将isolation_level设置为None.",这是否意味着,在我们将isolation_level设置为None之后,任何类型的DML操作都将自动提交?所以性能无法提高.我的理解是对的吗?我从这个URL跳到这里:http://stackoverflow.com/questions/17867605/performance-of-insert-with-python-and-sqlite3 (3认同)
  • 我在官方 SQLite 文档中发现了这一点(https://www.sqlite.org/c3ref/get_autocommit.html),它澄清了 python 文档中“自动提交”所指的内容。似乎如果不使用 BEGIN 语句,所有语句都会以“自动提交”模式执行。因此,就我们用 BEGIN/COMMIT 括起来的语句而言,当isolation_level 设置为 None 时,就没有这样的自动提交。希望有帮助。 (2认同)