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

Python中如何在SQL查询中使用列表类型参数CODE?

解决方案

核心结论

不能直接把CODE列表变量直接嵌入SQL语句中,这种写法不仅语法不合法,还会带来严重的SQL注入风险。必须使用参数化查询来安全传递变量,同时可根据需求选择逐个查询或批量查询的方式。

逐个查询每个CODE值

如果需要对CODE列的每个元素单独执行一次查询(如分别查询Car、Bike、Boat对应的记录),可以循环遍历该列,用参数化方式传递值:

import pandas as pd
import pyodbc

# 假设Table1是已加载的目标DataFrame
CODE_series = Table1['CODE']

dbconnection = pyodbc.connect(
    'Driver={SQL Server};'
    'Server=XXXX,1234;'
    'Database=AAAA;'
    'Trusted_Connection=yes;'
)

# 定义参数化SQL模板,pyodbc使用?作为参数占位符
sql_template = "SELECT * FROM [Table] WHERE CODE = ?"

# 遍历每个CODE值,执行查询并收集结果
results = []
for code_value in CODE_series:
    # 通过params参数传递变量,避免字符串拼接风险
    selection = pd.read_sql(sql_template, dbconnection, params=[code_value])
    results.append(selection)

# 可选:将所有查询结果合并为一个DataFrame
final_result = pd.concat(results, ignore_index=True)

# 关闭数据库连接
dbconnection.close()

批量查询所有CODE值

如果想一次性获取所有CODE对应的记录,无需循环,可结合IN条件和参数化实现:

import pandas as pd
import pyodbc

CODE_series = Table1['CODE']
# 将DataFrame列转换为列表
code_list = CODE_series.tolist()

dbconnection = pyodbc.connect(
    'Driver={SQL Server};'
    'Server=XXXX,1234;'
    'Database=AAAA;'
    'Trusted_Connection=yes;'
)

# 根据CODE数量生成对应数量的占位符,如3个值生成?, ?, ?
placeholders = ', '.join(['?'] * len(code_list))
sql_template = f"SELECT * FROM [Table] WHERE CODE IN ({placeholders})"

# 一次性执行批量查询
selection = pd.read_sql(sql_template, dbconnection, params=code_list)

dbconnection.close()

关键注意事项

  • 绝对禁止用字符串拼接生成SQL语句(如sql = f"SELECT * FROM Table WHERE CODE = '{code_value}'"),这种写法会引发SQL注入漏洞,还无法正确处理含特殊字符(如单引号)的CODE值。
  • pyodbc针对SQL Server使用?作为参数占位符,不同数据库驱动的占位符规则可能不同,但参数化查询的核心逻辑一致。
  • 若CODE列存在重复值,批量查询会自动返回去重后的结果,而逐个查询会保留重复的查询结果,可根据实际需求选择对应方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:51:52