使用列表过滤从SQL Server导入数据到pandas dataframe时返回空表
问题原因排查
- 核心逻辑错误:你在SQL语句里直接写了
in ('test_list'),相当于查询Staff_Name_in_new_df_variable等于字符串'test_list'的记录,完全没有关联你提前生成的test_list变量的值,这是返回空表的最主要原因。 - 潜在风险问题:直接拼接SQL字符串容易引发注入风险,同时如果列表里的姓名包含单引号会直接导致语法报错。
- 拼写校验提醒:代码中出现的
Varible_2拼写可能存在错误(标准拼写为Variable),字段名拼写错误也会导致查询结果为空。
正确实现方案
使用pandas的params参数做参数化查询,安全且自动处理特殊字符:
import pandas as pd import pyodbc test_list = previous_df["StaffName"].tolist() # 空列表提前判断,避免后续SQL语法错误 if len(test_list) == 0: new_df = pd.DataFrame() else: cnxn_str = ("Driver={XXXXXXXX};" "Server=XXXXXXXXXXXX;" "Database=XXXXXXXXX;" "UID=XXXXXXXXXX;" "PWD=XXXXXXXXXX;") cnxn = pyodbc.connect(cnxn_str) # 按列表长度生成对应数量的参数占位符 placeholders = ', '.join('?' for _ in test_list) sql_query = f""" SELECT * FROM XXXXXXXXXXXXXX WHERE Variable_1 in ('X1','X2','X3', 'X4') AND Varible_2= 'XXXXXXX' AND Staff_Name_in_new_df_variable in ({placeholders}) """ # 传入参数执行查询 new_df = pd.read_sql(sql_query, cnxn, params=test_list) # 关闭连接 cnxn.close()
内容的提问来源于stack exchange,提问作者PRuss
相关产品推荐
相关产品推荐

