2011-03-16 113 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) 

这是一个简单的情况,但可能混淆了一点,我希望它可以帮助谁卡住了。