2011-03-16 114 views
9

我試圖使用executemany插入到數據庫中的值,但它只是不會爲我工作。下面是一個示例:我不能讓Python的executemany sqlite3正常工作

clist = [] 
clist.append("abc") 
clist.append("def") 
clist.append("ghi") 
cursor.executemany("INSERT INTO myTable(data) values (?) ", clist) 

這給了我下面的錯誤:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied.

然而,當我更改列表,它工作正常:

clist = ["a", "b"] 
cursor.executemany("INSERT INTO myTable(data) values (?) ", clist) 

它的工作原理預期!我可以看到數據庫中的數據。爲什麼第一個列表不起作用?

(PS:這只是一個示例,而不是實際的代碼,爲簡單起見,我做了一個小測試用例)。

回答

12

據我所知executemany的,你的意思是,

clist = [("abc",), ("def",), ("ghi",)] 
cursor.executemany("INSERT INTO myTable(data) values(?)", clist) 

或類似的東西。不要在sqlite的語法中引用我,我在一段時間內沒有在應用中使用它,但是你需要一個可迭代的元組(更一般的迭代器)。

它看起來像你得到的錯誤是,它試圖通過你提供的每個字符串進行迭代,所以你的語句的工作方式:

clist = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')] 

我不知道你的第二個查詢是什麼試圖完成,但它似乎解決了一個不同的表,所以我猜測沒有模式信息,但如果您將單字符字符串更改爲多字符字符串,它也會失敗。

+0

他們都是同樣的表格。我對打字錯誤很不好。現在解決它的問題。它是一張簡單的桌子,裏面有一個領域。 – brainydexter 2011-03-16 21:39:26

+0

是啊...我仍然回答你的兩個問題,雖然... – marr75 2011-03-16 21:42:42

+0

你可以請在這裏再次發表評論,關於第二個clist。我認爲,發佈了他的答案的人刪除了它,並且隨之消失了。 – brainydexter 2011-03-17 02:51:38

5

只是爲了配合背景:在一個密切相關的情況下我的意思是插入聚元組列表到使用executemany作爲這樣一個表:SQLite的

res = [("John", "2j4o1h2n"), ("Paula", "lsohvoeemsy"), ("Ben", "l8ers")] 

cur.executemany("INSERT INTO users (user, password) VALUES (?)", res) 

期待把一個元組在同一時間(因此在值字段中?參數取代)和分割它分成以其包封屬性(<username>, <password>在這種情況下),它與一個sqlite3.ProgrammingError例外The current statement uses 1, and there are 2 supplied.失敗,以及,如SQLite的預計分別取代在VALUES (...)字段屬性。因此,這修復它:

cur.executemany("INSERT INTO users (user, password) VALUES (?, ?)", res) 

這是一個簡單的情況,但可能混淆了一點,我希望它可以幫助誰卡住了。