15

我试图使用 executemany 将值插入数据库,但它对我不起作用。这是一个示例:

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:这只是一个示例而不是实际代码。为简单起见,我做了一个小测试用例)。

4

2 回答 2

18

根据我对executeman的了解,你的意思是,

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

或类似的东西。不要引用我关于 sqlite 的语法,我已经有一段时间没有在应用程序中使用它了,但是您需要一个可迭代的元组(更普遍的是可迭代)。

看起来你得到的错误是它试图遍历你提供的每个字符串,所以你的语句的工作方式如下:

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

我不知道您的第二个查询要完成什么,但它似乎针对不同的表,所以我猜测没有架构信息,但是如果您将单个字符串更改为多字符串,它也会失败.

于 2011-03-16T21:24:08.983 回答
13

只是为了补充上下文:在一个密切相关的情况下,我打算将一个多元组列表插入到一个表中,使用executemany如下:

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

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

期望 SQLite 一次获取一个元组(因此 VALUES 字段中的单个 ?参数替换)并将其拆分为其封装的属性(<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)

这是一个微不足道的案例,但可能会有些混乱,我希望它可以帮助遇到困难的人。

于 2013-03-15T06:27:14.213 回答