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

标签 python python-3.x sqlite pysqlite

情况:需要向 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 会产生大量变量绑定(bind),而 SQLite 有一个 upper limit它可以处理的主机参数数量,默认为 999。

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

编辑:根据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 倍左右。

关于python - 哪个更好-execute(INSERT) 或executemany(INSERT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51237507/

相关文章:

python - PyCharm 中的 pip 版本不一致

sqlite - 运行 SQLite 命令并退出?

java - 将数据库读入应用程序/在 ListView 中显示它

python - 键绑定(bind) 1-5 不工作 Tkinter

python - 如何使用 FastText 查找相似词?

python - 基本神经网络,权重过高

python-3.x - numpy.dot() 给出 TypeError : can't multiply sequence by non-int of type 'float'

ios - 如何在 iOS 的 sqlite 数据库中存储音频文件

python - 如何在qt设计器中将函数连接到qt小部件? - Python

python - Linux 启动期间自动启动和停止 APScheduler?