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
相关产品推荐
相关产品推荐

