我无法让Python的sqlite3执行executemany正常工作
我在尝试使用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')]
我不知道你的第二个查询想要实现什么,但它似乎是针对一个不同的表,所以我只是根据没有架构信息来猜测,如果你把单字符的字符串改成多字符的字符串,它也会失败。