使用其他参数将列表绑定到Pandas read_sql_查询中的参数

我一直在尝试测试各种使代码运行的方法。首先,我有以下清单:

member_list=[111222333444555,…]

我试图将其传递到此查询中:

query=pd.read\u sql\u query(
"""
选择成员id
年月
从查询的表
年和月之间在哪里?和?
会员身份证在哪?
“”,db2conn,params=[201601,201603,成员列表])

但是,我得到一个错误,它说:

‘无效的参数类型。参数索引=2参数类型=列表“HY105”

所以我环顾四周,尝试使用格式化字符串:

query=pd.read\u sql\u query(
"""
选择成员id
年月
从查询的表
年和月之间在哪里?和?
和(%s)中的成员id
“”“%,”.join(“?”]*len(成员列表),db2conn,params=[201601,201603,元组(成员列表)])

现在,我得到一个错误:

‘SQL包含18622个参数标记,但提供了3个参数”HY000’

因为它希望填充格式化字符串中的所有占位符

那么,最终,是否有一种方法可以评估列表并传递每个单独的元素以绑定到,或者是否有另一种方法可以让它工作

顺便说一句,我正在使用pyodbc作为我的连接器

提前谢谢

将其分为三个部分,以帮助隔离问题并提高可读性:

  1. 构建SQL字符串
  2. 设置参数值
  3. 执行pandas.read\u sql\u查询

构建SQL

首先确保占位符设置正确。使用str.format和str.join和len,根据成员列表长度动态填写s。下面的示例假设3个成员列表元素

范例

成员列表=(1,2,3)
sql=“选择成员id,年-月”
从查询的表
其中{0}和{0}之间的yearmonth
以及{1}中的成员id“;
sql=sql.format(“?”,“,”.join(“?”*len(成员列表)))
打印(sql)

返回

选择成员id,年/月
从查询的表
年和月之间在哪里?和?
和成员id在(?,?)

设置参数值

现在,请确保将参数值组织成一个平面元组

范例

用于展平不规则嵌套序列值的生成器,
#根据答案修改http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python
def展平(l):
对于l中的el:
尝试:
压扁产量(el)
除类型错误外:
产量el
params=元组(展平((201601,201603,成员列表)))
打印(参数)

返回

(201601、201603、1、2、3)

执行

最后,在read\u sql\u query调用中将sqlparams值放在一起

query=pd.read\u sql\u查询(sql,db2conn,params)

发表评论