我知道executemany可以用来方便地将新条目添加到数据库中; 与executefor循环中的单个s 相比,减少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()
Run Code Online (Sandbox Code Playgroud)
我甚至不确定下面的方法是否会更快(必须对它进行基准测试),但问题是它不起作用,因为我做错了我假设.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()
Run Code Online (Sandbox Code Playgroud)
非常感谢您的提示和见解!
编辑1:
底部示例的问题:
ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 50000 supplied.
Run Code Online (Sandbox Code Playgroud)
(其中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()
Run Code Online (Sandbox Code Playgroud)
但感谢@falsetru我注意到我的错误,应该是
... WHERE id=?", data_conts)
Run Code Online (Sandbox Code Playgroud)
并不是
... WHERE id=?", (data_conts,))
Run Code Online (Sandbox Code Playgroud)
fal*_*tru 12
你需要传递一系列序列([[cont,id], [cont,id], [cont,id], ...]而不是[cont, cont, cont, ...], [id, id, id, ..]):
for path in paths:
params = []
for data in some_computation(path):
if len(data_ids) >= CHUNKSIZE:
c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?", params)
cnx.commit()
params = []
params.append([data[1], data[0]])
if params:
c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?", params)
cnx.commit()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7212 次 |
| 最近记录: |