Python SQLite3 - 每条插入语句都会自动开始和结束事务吗?

1 投票
2 回答
976 浏览
提问于 2025-04-18 10:48

我正在尝试优化我的SQLite3插入操作,因为我正在处理一些大数据集。

我想知道的是,.execute("INSERT...") 语句每次执行时都会开始和结束一个事务吗?还是说它只在第一次执行时开始一个事务,然后等到我执行.commit()操作时才结束?也就是说,我可以执行10,000个.execute命令,然后再执行一次.commit(),这样我就只进行了一个事务?

我对这方面的理解不是很清楚,非常希望能得到一些帮助。

2 个回答

0

文档中提到:

默认情况下,sqlite3 模块在执行数据修改语言(DML)语句之前,会自动开启一个事务(也就是 INSERTUPDATEDELETEREPLACE 这些操作),而在执行非 DML 的非查询语句之前(也就是除了 SELECT 以外的其他操作),会自动提交事务。

0

来自SQLite优化常见问题解答:

除非已经在一个事务中,否则每条SQL语句都会为其启动一个新的事务。这是非常耗费资源的,因为每条语句都需要重新打开、写入和关闭日志文件。通过在一系列SQL语句前后加上BEGIN TRANSACTION;END TRANSACTION;,可以避免这种情况。即使是那些不改变数据库的语句,这种加速效果也是可以获得的。

所以,有两种方法:

  1. 使用executemany()方法。
  2. 使用明确的BEGINCOMMIT语句。

[1] http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

撰写回答