首页 > 解决方案 > 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')

这就像一首歌

万分感谢

标签: pythonmysql

解决方案


你可以用这个来完成它:

 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)

推荐阅读