Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
Python 传递列表作为查询的参数_Python_Mysql_Pymysql - Fatal编程技术网

Python 传递列表作为查询的参数

Python 传递列表作为查询的参数,python,mysql,pymysql,Python,Mysql,Pymysql,在pymysql中,有没有一种方法可以将python列表作为prepared语句的参数传递 list_id = [1,2,3] sql = "select * from table where id in (%s)" cursor.execute(sql,(list_id,)) 如果您的列表只有整数,那么您必须将它们与一个“,”组合,并作为字符串传递。我会这样做 list_id = [1,2,3] sql = "select * from table where id in ({})".for

在pymysql中,有没有一种方法可以将python列表作为prepared语句的参数传递

list_id = [1,2,3]
sql = "select * from table where id in (%s)"
cursor.execute(sql,(list_id,))

如果您的列表只有整数,那么您必须将它们与一个“,”组合,并作为字符串传递。

我会这样做

list_id = [1,2,3]
sql = "select * from table where id in ({})".format(",".join([str(i) for i in list_id]))
print(sql)

Out[]: "select * from table where id in (1,2,3)"
如果您需要另一种运行执行的方式,这里是另一个通过
pyodbc
库执行多个游标的参考。希望能有帮助

executemany(sql,*params)

对每个集合执行相同的SQL语句 参数,返回None。单个参数必须是 序列的序列,或序列的生成器

params=[('A',1),('B',2)]executemany(“插入到t(名称,id)中) 值(?,),参数)这将执行SQL语句两次, 一次与('A',1)连用,一次与('B',2)连用


但更好的方法是,通过上面的重复答案,或如上面的重复答案所述,来防止结构疯狂的陈述。)

它不工作PyMySQL不接受逗号分隔string@Jean-Françoisfare这也是一种不好的做法,因为它对SQL注入是开放的。不过,您想构造什么样的SQL语句?@EvgenyPogrebnyak几乎肯定
SELECT*来自(1,2,3)
中的某个值。事实上,我认为您的查询可以工作,但这仍然是一种不好的做法。编辑否,它将不起作用,因为您将字符串插值语法与SQL参数化查询混合在一起。否。没有办法做到这一点。。。将一组(列表)值传递到单个绑定占位符。准备好的语句绑定值是标量值。不可能传入将被解释为SQL的语法。要执行这条带有绑定占位符的准备好的语句,SQL文本需要是“
SELECT*FROM table WHERE id IN(?,?)
”,每个值都有一个单独的问号。我们可以编写代码来计算列表中的值的数量,然后动态生成一个包含所需占位符数量的SQL语句。@spencer7593我认为这正是链接问题答案中解释的技术这不是OP所要求的。他们想要一个可以在中使用
的查询,然后提供列表;所以我修改了答案。感谢提醒您,您的编辑令人困惑(什么关联ID
executemany
?)并且可能存在SQL注入的主要风险。这里根本没有理由使用字符串格式。阅读副本对您很有用,因为如果您在生产代码中执行类似操作,您会诚实地面对重大问题。@roganjosh,我知道SQL注入的风险。感谢您指出我的代码中的缺陷,因为我肯定没有直接的数据库设计经验,所以我可能缺乏经验。我只是想帮助OP,因为OP试图将一组列表传递到一个占位符中,我认为可以通过将
int
元素转换为
str
并用逗号连接它以符合SQL语法来解决这个问题。
list_id = [1,2,3]
# not working:
list_str = ', '.join(list_id)
# most likely:
list_str = ', '.join(map(str, list_id))