sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-11-30 22:12:04 27 4
mua khóa gpt4 Nike

情况:需要向 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()

问题:如果忽略速度,从编程的角度来看,哪种做法更好?如果可能的话,也解释一下原因。

1 Câu trả lời

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

准备好的陈述很好。然而,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/XÓA BỎ/REPLACE), and commits transactions implicitly before a non-DML, non-query statement (i. e. anything other than LỰA CHỌN or the aforementioned).

因此,#method1 中的代码正在执行 [BEGIN]、INSERT,LÀM、[BEGIN] 、INSERT,LÀM...,其中 BEGIN 由 Python 隐式发送以启动事务,并且 LÀM 显式发送结束它。如果您的代码结构如下:

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

然后你在开始处有一个隐式的BEGIN,大量的INSERTS和在最后一个显式的LÀM。这应该会使您的代码速度提高 10-20 倍左右。

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

27 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com