我知道executemany
可以方便地將新條目添加到數據庫;與for循環中的單個execute
相比,可用於減少Python方法調用開銷。但是,我想知道這是否可以與SQLite的UPDATE
一起使用。使用`executemany`來更新現有SQLite3數據庫中的條目(使用Python sqlite3)
更具體地,請考慮以下設置:
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()
非常感謝您的提示和見解!
EDIT 1:
與底部例子的問題:
ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 50000 supplied.
(其中CHUNKSIZE = 50000)
編輯2:
發生同樣的錯誤
但由於@falsetru然後我發現我的錯誤,它應該是
... WHERE id=?", data_conts)
,而不是
... WHERE id=?", (data_conts,))
謝謝,我之前嘗試過類似的東西,但是我不小心傳遞了'[[cont,id],[cont,id],[cont,id],...]]'這就是爲什麼它沒有工作 – Sebastian