我知道executemany
可用于方便地向数据库添加新条目;与for循环中的单个execute
相比,有助于减少Python方法调用开销。但是,我想知道这是否可以与SQLite的UPDATE
一起工作。
更具体地说,请考虑以下设置:
cnx = sqlite3.connect(DATABASE)
c = cnx.cursor()
for path in paths:
for data in some_computation(path):
c.execute("UPDATE TABLENAME SET cont=? WHERE id=?", (data[1], data[0]))
cnx.commit()
cnx.close()
我甚至不确定下面的方法是否更快(必须对其进行基准测试),但问题是它不起作用,因为我做得不对,我想。在下面的代码片段中使用executemany
来完成我在上面发布的任务有什么提示吗?
cnx = sqlite3.connect(DATABASE)
c = cnx.cursor()
for path in paths:
data_ids, data_conts = [], []
for data in some_computation(path):
if len(data_ids) >= CHUNKSIZE:
c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?", (data_conts, data_ids))
cnx.commit()
data_ids, data_conts = [], []
data_ids.append(data[0])
data_conts.append(data[1])
c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?", (data_conts, data_ids))
cnx.commit()
cnx.commit()
cnx.close()
非常感谢你的建议和见解!
编辑1:
下面例子的问题是:
ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 50000 supplied.
(其中CHUNKSIZE=50000)
编辑2:
同样的错误也会发生
cnx = sqlite3.connect(DATABASE)
c = cnx.cursor()
for path in paths:
data_conts = []
for data in some_computation(path):
if len(data_ids) >= CHUNKSIZE:
c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?", (data_conts,))
cnx.commit()
data_conts = []
data_conts.append([data[1], data[0]])
c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?", (data_conts,))
cnx.commit()
cnx.commit()
cnx.close()
但多亏了@falsetru,我才发现我的错误,应该是
... WHERE id=?", data_conts)
而不是
... WHERE id=?", (data_conts,))
您需要传递序列(
[[cont,id], [cont,id], [cont,id], ...]
,而不是[cont, cont, cont, ...], [id, id, id, ..]
):你所拥有的是完美的,除了你应该使用zip(conts,ids),其中conts和ids是列表。这将自动为您重新排列。
相关问题 更多 >
编程相关推荐