Python中如何将字符串列表正确传入SQL查询语句
Python拼接SQL字段列表语法错误修复方案
问题场景
- 从pandas DataFrame中提取字段名生成列表,用于拼接SQL查询的SELECT子句,提取字段列表的代码如下:
list_cols=df_cols['COLUMN_NAME'].values.tolist() list_cols
- 初始拼接SQL时直接将列表插入f-string,代码如下:
sql=(f'''select {list_cols} from big where date = '20220501' ''') sql
- 运行后生成的SQL存在语法错误,输出内容里字段部分直接带上了列表的方括号和元素的单引号,错误输出示例:
"select\n ['DATES', 'ID', 'ID2', ... , 'ID100']\n from\n big\n where\n date= '20220501'\n"
补充说明:字段列表长度超过100个,不考虑手动拼接、Excel辅助拼接的方案,仅需要纯Python代码实现。
解决方法
直接在f-string中插入列表对象时,Python会自动调用列表的字符串转换方法,输出列表的原生展示格式,自然会带上方括号、元素引号,不符合SQL语法。只需要用字符串的join方法,将列表元素用英文逗号拼接为连续的字段字符串即可。
修正后的代码:
# 用逗号拼接所有字段名,生成SQL兼容的字段片段 cols_segment = ', '.join(list_cols) sql=(f'''select {cols_segment} from big where date = '20220501' ''')
生成的SQL语句结构如下,无多余符号,可直接执行:
select DATES, ID, ID2, ... , ID100 from big where date = '20220501'
额外提示:如果使用的数据库要求字段名包裹标识符(比如MySQL用反引号、PostgreSQL用双引号),可以在拼接时给每个字段统一加上包裹符,以MySQL为例:
# 给每个字段名包裹反引号,避免字段名是保留字、含特殊字符时报错 cols_segment = ', '.join(f'`{col}`' for col in list_cols)
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

