我一直在尝试测试各种使代码运行的方法。首先,我有以下清单:
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作为我的连接器
提前谢谢
将其分为三个部分,以帮助隔离问题并提高可读性:
- 构建SQL字符串
- 设置参数值
- 执行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调用中将sql和params值放在一起
query=pd.read\u sql\u查询(sql,db2conn,params)