Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';t获取Python';让sqlite3正常工作的s executemany_Python_Sqlite_Pysqlite - Fatal编程技术网

我能';t获取Python';让sqlite3正常工作的s executemany

我能';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个。 但是,当

我试图使用ExecuteMy将值插入到数据库中,但它对我来说根本不起作用。以下是一个示例:

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()来更新表。