2016-04-22 77 views
4

我可以用這個代碼做SQLITE3非常有效的批量插入關於Python(2.7):Sqlite3 Python:如何做一個有效的批量更新?

cur.executemany("INSERT INTO " + tableName + " VALUES (?, ?, ?, ?);", data) 

但我不能得到更新,提高工作效率。我認爲這可能是數據庫結構/索引問題,但即使在只有一行100行的測試數據庫中,更新仍需要大約2-3秒。

我試過不同的代碼變化。我有最新的代碼是從this answer約更新和executemany前一個問題,但它只是慢了我,因爲我所做的任何其他嘗試:

data = [] 
for s in sources: 
    source_id = s['source_id'] 
    val = get_value(s['source_attr']) 
    x=[val, source_id] 
    data.append(x) 
cur.executemany("UPDATE sources SET source_attr = ? WHERE source_id = ?", data) 
con.commit() 

我怎麼能改善這個代碼做一個大批量更新有效?

回答

0

當插入一條記錄時,數據庫只需要在表的末尾寫一行(除非你有類似UNIQUE約束的東西)。

更新記錄時,數據庫需要找到該行。這需要通過整個表掃描(針對每個命令),除非你對搜索列的索引:

CREATE INDEX whatever ON sources(source_id); 

但如果source_idprimary key,你應該聲明爲這樣的(這將創建一個隱式索引):

CREATE TABLE sources(
    source_id INTEGER PRIMARY KEY, 
    source_attr TEXT, 
    [...] 
); 
+0

謝謝。它已經被索引。希望從那裏改進:) – LunaiThi