Python SQLite3 - 每条插入语句都会自动开始和结束事务吗?
我正在尝试优化我的SQLite3插入操作,因为我正在处理一些大数据集。
我想知道的是,.execute("INSERT...") 语句每次执行时都会开始和结束一个事务吗?还是说它只在第一次执行时开始一个事务,然后等到我执行.commit()操作时才结束?也就是说,我可以执行10,000个.execute命令,然后再执行一次.commit(),这样我就只进行了一个事务?
我对这方面的理解不是很清楚,非常希望能得到一些帮助。
2 个回答
0
文档中提到:
默认情况下,sqlite3 模块在执行数据修改语言(DML)语句之前,会自动开启一个事务(也就是
INSERT
、UPDATE
、DELETE
、REPLACE
这些操作),而在执行非 DML 的非查询语句之前(也就是除了SELECT
以外的其他操作),会自动提交事务。
0
来自SQLite优化常见问题解答:
除非已经在一个事务中,否则每条SQL语句都会为其启动一个新的事务。这是非常耗费资源的,因为每条语句都需要重新打开、写入和关闭日志文件。通过在一系列SQL语句前后加上
BEGIN TRANSACTION;
和END TRANSACTION;
,可以避免这种情况。即使是那些不改变数据库的语句,这种加速效果也是可以获得的。
所以,有两种方法:
- 使用
executemany()
方法。 - 使用明确的
BEGIN
和COMMIT
语句。
[1] http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html