哪个更好 - execute(INSERT) 或 executemany(INSERT)

Which is better - execute(INSERT) or executemany(INSERT)

情况:需要向 SQLite 数据库中插入大量数据。

问题:我们可以使用两个语句来插入数据-

data = [("111", "222", "333"), ("AAA", "BBB", "CCC"), ("XXX", "YYY", "ZZZ")]

#method1
for item in data:
    cursor.execute("INSERT INTO table(value1, value2, value3) VALUES (?,?,?)", item)
    conn.commit()

#method2
cursor.execute("INSERT INTO table(value1, value2, value3) VALUES(?,?,?)", data)
conn.commit()

问题:如果忽略速度,从编程的角度来看,哪个更好?如果可能,请解释原因。

从纯编程实践的角度来看,除了速度之外,没有什么区别。然而...

准备好的语句很好。但是,mass-insert 会生成大量变量绑定,SQLite 可以处理的主机参数数量为 upper limit,默认为 999。

因此,多插入很适合玩弄,但对于实际数据,您将使用循环。不过,我可以提供的一个好建议是,您需要将循环包装在一个事务中,因为如果没有它,AFAIK,每个插入都将是一个自动事务,这将极大地影响时间。 (另外,在循环结束时提交,而不是在循环内提​​交。)

编辑:根据 Python 文档,

By default, the sqlite3 module opens transactions implicitly before a Data Modification Language (DML) statement (i.e. INSERT/UPDATE/DELETE/REPLACE), and commits transactions implicitly before a non-DML, non-query statement (i. e. anything other than SELECT or the aforementioned).

所以您在 #method1 中的代码正在执行 [BEGIN]、INSERTCOMMIT、[BEGIN]、INSERTCOMMIT... BEGIN 由 Python 隐式发送以开始事务,并且 COMMIT 显式结束它。如果您的代码结构如下:

for item in data:
    cursor.execute("INSERT INTO table(value1, value2, value3) VALUES (?,?,?)", item)
conn.commit()

然后你有一个隐含的 BEGIN 在开始,很多 INSERTS 和一个显式的 COMMIT 在结尾。这将使您的代码速度提高 10-20 倍左右。