2015-11-19 100 views
4

我知道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,)) 

回答

8

您需要通過序列的序列([[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() 
+0

謝謝,我之前嘗試過類似的東西,但是我不小心傳遞了'[[cont,id],[cont,id],[cont,id],...]]'這就是爲什麼它沒有工作 – Sebastian

0

你有什麼是完美的除了你應該我們e zip(conts,ids)conts和id是列表。這會自動爲您重新排列。