You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python数据科学:如何在pd.read_sql查询WHERE条件中传入列表/向量

嘿,作为刚接触Python数据科学的新手,能想到在SQL端做过滤而不是全量加载数据到内存,这个思路真的很赞!下面我就分数字列表和字符串列表两种常见场景,给你具体的实现方法,都是安全且高效的方案:

处理数字列表的传入

对于数字类型的过滤条件,我们可以利用pyodbc的参数化查询能力,既避免SQL注入风险,又能让SQL Server正确解析过滤条件:

import pyodbc
import pandas as pd

# 1. 建立SQL Server连接(替换成你的实际连接信息)
conn = pyodbc.connect(
    'DRIVER={SQL Server};SERVER=你的服务器地址;DATABASE=你的数据库名;UID=用户名;PWD=密码'
)

# 2. 定义要传入的数字列表
age_num_list = [10, 20, 30, 40]

# 3. 生成与列表长度匹配的占位符(每个?对应一个参数)
placeholders = ', '.join(['?'] * len(age_num_list))
# 4. 构造SQL查询语句
sql_query = f"SELECT * FROM 你的表名 WHERE age_column IN ({placeholders})"

# 5. 执行查询,把列表作为params参数传入
result_df = pd.read_sql(sql_query, conn, params=age_num_list)

# 6. 记得关闭连接
conn.close()

原理很简单:', '.join(['?'] * len(age_num_list))会根据列表长度生成对应数量的?占位符,pyodbc会自动把列表里的数字一一对应到占位符上,完全不需要你手动拼接数字或加引号。

处理字符串列表的传入

字符串列表的处理逻辑和数字列表基本一致,区别只是列表元素是字符串,pyodbc会自动帮你处理字符串的引号和转义(比如字符串里包含单引号的情况也能正确处理):

比如你提到的示例raw_data2 = {'age1': ['ten','twenty']},可以这样实现:

import pyodbc
import pandas as pd

conn = pyodbc.connect(
    'DRIVER={SQL Server};SERVER=你的服务器地址;DATABASE=你的数据库名;UID=用户名;PWD=密码'
)

# 从字典中取出字符串列表
raw_data2 = {'age1': ['ten','twenty']}
age_str_list = raw_data2['age1']

# 同样生成占位符
placeholders = ', '.join(['?'] * len(age_str_list))
sql_query = f"SELECT * FROM 你的表名 WHERE age_str_column IN ({placeholders})"

# 执行查询,传入字符串列表
result_df = pd.read_sql(sql_query, conn, params=age_str_list)

conn.close()

重要提醒

千万不要直接把字符串列表拼进SQL语句里(比如f"WHERE age IN ({', '.join(age_str_list)})"),这样不仅会有SQL注入的风险,还会因为字符串未正确转义导致查询报错(比如字符串里有O'Neil这种带单引号的内容)。用上面的参数化方式才是最安全可靠的。

内容的提问来源于stack exchange,提问作者Murali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:33:50