我能';t获取Python';让sqlite3正常工作的s executemany
我试图使用ExecuteMy将值插入到数据库中,但它对我来说根本不起作用。以下是一个示例:我能';t获取Python';让sqlite3正常工作的s executemany,python,sqlite,pysqlite,Python,Sqlite,Pysqlite,我试图使用ExecuteMy将值插入到数据库中,但它对我来说根本不起作用。以下是一个示例: clist = [] clist.append("abc") clist.append("def") clist.append("ghi") cursor.executemany("INSERT INTO myTable(data) values (?) ", clist) 这给了我以下错误: sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用1,提供了3个。 但是,当
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)
它按预期工作!我可以看到数据库中的数据。为什么第一个列表不起作用,而第二个列表起作用
(注:这只是一个示例,不是实际代码。为了简单起见,我做了一个小测试用例)。根据我对ExecuteMy的了解,你的意思是
clist = [("abc", ), ("def", ), ("ghi", )]
cursor.executemany("INSERT INTO myTable(data) values(?)", clist)
或者类似的东西。不要引用我的sqlite语法,我已经有一段时间没有在应用程序中使用它了,但是你需要一个元组的iterable(更一般的是iterable)
看起来您遇到的错误是,它试图遍历您提供的每个字符串,因此您的语句的工作方式如下:
clist = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]
我不知道您的第二个查询试图完成什么,但它似乎针对不同的表,因此我猜测没有架构信息,但是如果您将单字符字符串更改为多字符字符串,它也会失败。只是为了补充上下文:在一个密切相关的情况下,我打算使用
executemany
将一个多元组列表插入表中,如下所示:
res = [("John", "2j4o1h2n"), ("Paula", "lsohvoeemsy"), ("Ben", "l8ers")]
cur.executemany("INSERT INTO users (user, password) VALUES (?)", res)
希望SQLite一次获取一个元组(因此在值字段中使用单个?
参数替换),并将其拆分为封装的属性(,
,在本例中),它失败了,出现了sqlite3。ProgrammingError
异常当前语句使用1,此外,还提供了2个。
,SQLite希望在值(…)
字段中单独替换属性。这就解决了这个问题:
cur.executemany("INSERT INTO users (user, password) VALUES (?, ?)", res)
这是一个微不足道的案例,但可能会有点混淆,我希望它能帮助那些陷入困境的人。它们都是相同的表格。我的拼写错误很糟糕。现在在问题中修复了它。这是一个简单的表格,里面只有一个字段。你能在这里再次发表关于第二个clist的评论吗。我想,那个贴出答案的人,删除了它,它就这样消失了。我不知道你到底在问什么。字符串在python中是可编辑的,因此字符串的行为非常类似于字符的元组。execute调用(扩展为executemany)需要一个iterable参数,例如,(1,2,3,'abc')或范围(3)或任何支持迭代的对象。因此,由于字符串支持迭代,它们也可以作为参数的集合来工作。execute语句需要一个包含一个项的iterable,该项由第二个clist(一个包含一个字符的字符串列表)完成,而不是由第一个clist(一个包含3个字符的字符串列表)完成。在executemany之后,需要conn.commit()来更新表。