Python 传递列表作为查询的参数
在pymysql中,有没有一种方法可以将python列表作为prepared语句的参数传递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
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所要求的。他们想要一个可以在中使用的查询,然后提供列表;所以我修改了答案。感谢提醒您,您的编辑令人困惑(什么关联IDexecutemany
?)并且可能存在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))