python - Python如何使用传递的任意数量的值进行mysql参数化查询
问题描述
我正在使用 pyhon3
我需要从 python 程序对mysql数据库进行 sql 查询 该查询有一个 in 子句,我需要将任意(或不同)数量的值传递给“in”子句。考虑下面的这个查询,它的 in 子句具有固定的数字 (3) 值
select column1 from mytable where uniqueid in(1,5,9);
对于如上所示的 in cluase 的已知数量的“唯一”值,我在下面使用 python 参数化查询
myquery=("select column1 from mytable where uniqueid in(%s,%s,%s)")
idvals=(1,5,9)
mycursor=mydbconn.cursor(dictionary=True, buffered=True)
mycursor.execute(myquery,idvals)
但是,我的问题是发送到“in”子句的值必须是任意数量的值(从另一个查询中获得)......例如,请参见下面的查询 -
select column1 from mytable where uniqueid in(1,5,9,7,11);
select column1 from mytable where uniqueid in(2,4,1,11,9,13,97,66);
这意味着我需要将不同长度的列表传递给查询,并且更多参数的占位符“%s”也需要是可变的
如何编写这样的查询,我可以将任意值列表作为参数传递给 sql 查询
根据下面 Martin 的回复,我编写了完整的程序如下
# this solution worked ( thanks Martin -- see below)
valuecursor=dbconn.cursor(buffered=True)
valuequery="select uniqueid from sometable"
valuecursor.execute(valuequery);
valuelist=[i[0] for i in valuecursor.fetchall()]
valuetuple=tuple(valuelist)
queryBase = "select column1 from mytable where uniqueid in(%s)"
myquery = queryBase % ",".join('%s' for i in range(0, len(valuetuple)))
mycursor=dbconn.cursor(buffered=True)
mycursor.execute(myquery,)
结果查询字符串和元组符合预期
query string = "select column1 from mytable where uniqueid in(%s,%s,%s)" valuetuple = ('1','5','9')
这就像一首歌
万分感谢
解决方案
你可以用这个来完成它:
queryBase = "select column1 from mytable where uniqueid in(%s)"
invals = (1,5,9)
myQuery = queryBase % ",".join('%s' for i in range(0, len(invals)))
生成的 myQuery 是:
'select column1 from mytable where uniqueid in(%s,%s,%s)'
然后完成查询公式:
myQuery = myQuery % idvals
然后完成对数据库的查询:
mycursor = mydbconn.cursor(dictionary=True, buffered=True)
mycursor.execute(myQuery)
推荐阅读
- pandas - 数据框应用集未删除重复值
- yii - 创建一个 Yii 1.1 博客应用程序,带有不喜欢的帖子选项
- google-sheets - 如何每秒向单元格添加一个值(谷歌表格)?
- node.js - 无法从护照自定义中找出错误
- javascript - 如何将 React 组件转换为 PDF 文件?
- docker - 创建存储库时将 github 存储库添加到 dockerhub - 组织列表为空
- ros2 - 构建 ign-math 时出错:包含找不到请求的文件:IgnCMake(在 Windows 上安装 Gazebo)
- c# - 在 AWS Lambda 中访问 IWebHost?
- php - 随后的 WooCommerce 产品在购物车中具有固定价格折扣
- javascript - 如何捕获未处理的异常