在SQL查询中使用配置文件解析变量时遇格式错误求助
问题分析与解决
核心问题梳理
- 配置文件键名不匹配:配置里写的是
genre_codes,但代码中调用config.get('MyScript', 'genre_code')少了个s,导致无法正确读取genre代码。 - 分割后未清理空格:
split(',')会保留逗号后的空格,生成带空格的元素(比如' CODE2'),直接传入SQL会导致匹配失败。 - SQL参数顺序颠倒:SQL语句中先要求
SOC_CODE IN %s,再是GENRE_CODE IN %s,但你传入的参数顺序是(genre_code, soc_code),完全反了。 - 直接字符串拼接SQL:这种方式容易出格式问题,还存在SQL注入风险,应该用pandas支持的参数绑定方式。
修正后的代码
1. 修正配置读取与数据清洗
# 读取配置并清理每个代码前后的空格,同时修正键名 soc_code = tuple(code.strip() for code in config.get('MyScript', 'soc_code').split(',')) genre_code = tuple(code.strip() for code in config.get('MyScript', 'genre_codes').split(','))
2. 使用参数绑定执行SQL(推荐)
# 命名参数方式,可读性更强 sql_query = pd.read_sql_query(''' SELECT SOC_NAME, GENRE_NAME FROM DATA WHERE SOC_CODE IN %(soc_codes)s AND GENRE_CODE IN %(genre_codes)s ''', conn, params={'soc_codes': soc_code, 'genre_codes': genre_code})
或者用位置参数方式:
sql_query = pd.read_sql_query(''' SELECT SOC_NAME, GENRE_NAME FROM DATA WHERE SOC_CODE IN %s AND GENRE_CODE IN %s ''', conn, params=(soc_code, genre_code))
改动说明
- 用
strip()清理了每个代码前后的空格,避免因空格导致的数据库匹配错误。 - 修正了配置键名,确保能正确读取到genre的代码值。
- 调整了参数顺序,和SQL语句中的占位符一一对应。
- 使用
params参数绑定,pandas会自动处理SQL语法格式(比如把元组转成符合要求的(val1, val2)格式),同时彻底规避SQL注入风险。
内容的提问来源于stack exchange,提问作者MDUB77
相关产品推荐
相关产品推荐

