我无法让Python的sqlite3执行executemany正常工作

18 投票
2 回答
36512 浏览
提问于 2025-04-16 13:51

我在尝试使用executemany这个功能往数据库里插入数据,但就是不行。这里有个例子:

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

这段代码给我报了个错:

sqlite3.ProgrammingError: 绑定的数量不正确。当前语句需要1个,但提供了3个。

不过,当我换了个列表后,它就正常工作了:

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

这次一切都如我所愿!我能在数据库里看到数据。为什么第一个列表不行,而第二个就可以呢?

(顺便说一下,这只是个例子,并不是实际的代码。我只是做了个简单的测试案例)。

2 个回答

16

为了补充一下背景:在一个相关的情况下,我想用 executemany 方法把一个包含多个元组的列表插入到一个表里,像这样:

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

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

我原本期待 SQLite 每次只处理一个元组(所以在 VALUES 字段里只用了一个 ? 作为参数),然后把这个元组里的内容(比如 <username>, <password>)拆开来用。但是结果出现了一个错误,提示 sqlite3.ProgrammingError,内容是 当前语句使用了 1 个参数,但提供了 2 个。 这是因为 SQLite 期望在 VALUES (...) 字段里每个属性都要单独替换。所以这样修改就可以了:

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

这个例子很简单,但可能会让人有点困惑,希望能帮助到那些遇到类似问题的人。

22

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

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

或者类似的东西。关于sqlite的语法我不太确定,因为我有一段时间没在应用中使用过,但你需要一个包含元组的可迭代对象(更一般来说是可迭代的东西)。

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

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

我不知道你的第二个查询想要实现什么,但它似乎是针对一个不同的表,所以我只是根据没有架构信息来猜测,如果你把单字符的字符串改成多字符的字符串,它也会失败。

撰写回答