Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLite-如何手动开始和结束事务?_Python_Sqlite_Transactions - Fatal编程技术网

Python SQLite-如何手动开始和结束事务?

Python SQLite-如何手动开始和结束事务?,python,sqlite,transactions,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会在每个修改语句上自动打开一个事务

上下文

因此,我试图找出在Python中使用SQLite时如何正确覆盖自动事务。当我试着跑的时候

cursor.execute("BEGIN;")
.....an assortment of insert statements...
cursor.execute("END;")
我得到以下错误:

OperationalError: cannot commit - no transaction is active
我理解这一点是因为Python中的SQLite会在每个修改语句上自动打开一个事务,在本例中是一个INSERT

问题:

我试图通过每数千条记录做一个事务来加快插入速度。 如何克服自动打开交易的问题?

说明:

您可以通过connect()调用的隔离级别参数或连接的隔离级别属性来控制sqlite3隐式执行哪种类型的
BEGIN
语句(或根本不执行)

如果需要自动提交模式,则将隔离级别设置为
None


正如@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")

我对这句话有一个疑问:“如果你想要自动提交模式,那么将隔离级别设置为None。”,这是否意味着,在我们将隔离级别设置为None之后,任何类型的DML操作都将自动提交?因此,性能无法提高。我的理解是否正确?我从这个URL跳到这里:我和@ClockZHONG有着同样的担忧。根据我所做的一些调试,我认为该文档有误导性,它真正应该说的是
如果您想要手动处理事务,那么将隔离级别设置为None
。我发现这澄清了python文档所指的“autocommit”。似乎如果没有使用BEGIN语句,所有语句都以“自动提交”模式执行。因此,就我们用BEGIN/COMMIT来封装语句而言,当隔离级别设置为None时,就没有这样的自动提交。希望有帮助。