我试图使用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:这只是一个示例,而不是实际代码。为简单起见,我做了一个小测试用例。)
答案 0 :(得分:15)
据我所知,executemany,你的意思,
clist = [("abc", ), ("def", ), ("ghi", )]
cursor.executemany("INSERT INTO myTable(data) values(?)", clist)
或类似的东西。不要引用我的sqlite语法,我有一段时间没有在应用程序中使用它,但你需要一个可迭代的元组(更常见的是迭代)。
看起来你得到的错误是它试图遍历你提供的每个字符串,所以你的陈述就像:
clist = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]
我不知道你的第二个查询试图完成什么,但它似乎解决了一个不同的表,所以我猜测没有架构信息,但如果你将单个字符串更改为多字符串,它也会失败。
答案 1 :(得分:7)
只是为了补充上下文:在一个密切相关的情况下,我打算使用executemany
将多元组列表插入到表中:
res = [("John", "2j4o1h2n"), ("Paula", "lsohvoeemsy"), ("Ben", "l8ers")]
cur.executemany("INSERT INTO users (user, password) VALUES (?)", res)
期望SQLite一次获取一个元组(因此VALUES字段中的单 ?
参数替换)并将其拆分为其封装属性({{1}在这种情况下),它也失败了<username>, <password>
异常sqlite3.ProgrammingError
,因为SQLite期望在The current statement uses 1, and there are 2 supplied.
字段中单独替换属性。所以这解决了它:
VALUES (...)
这是一个微不足道的案例,但可能混淆了一点,我希望它可以帮助那些被卡住的人。