Python中如何使用字典替换字符串内的双大括号占位变量
双大括号占位符替换SQL变量的实现方案
原替换逻辑的问题点
- 硬编码了固定占位符,没有和传入的映射字典做联动
str.replace()传参错误,误把替换目标和替换值拆分到方法外,语法完全不符合Python字符串方法的调用规则
可直接复用的实现方法
原生无依赖实现
直接遍历映射字典的键值对,逐次匹配替换对应的双大括号占位符:
def substitute_values(qry, value_dict): # 不要用dict作为变量名,会覆盖Python内置的dict类型 if not value_dict: return qry for placeholder_key, real_value in value_dict.items(): # 拼接成完整的双大括号占位符格式 full_placeholder = "{{" + placeholder_key + "}}" qry = qry.replace(full_placeholder, str(real_value)) return qry
实际调用示例:
qry = """SELECT SUM(CASE WHEN {{cols_1}} is null AND {{cols_2}} > 0 THEN 1 ELSE 0 END) AS output FROM mytable""" value_map = {'cols_1': 'id', 'cols_2': 'weather'} final_sql = substitute_values(qry, value_map)
运行后即可得到预期的替换后SQL结果。
正则批量匹配实现
如果后续可能遇到占位符带额外空格(比如{{ cols_1 }})、需要自动校验未匹配占位符的场景,用正则方案的适配性更强:
import re def substitute_values(qry, value_dict): if not value_dict: return qry # 匹配所有{{变量名}}格式的片段,兼容变量名前后的空格 placeholder_pattern = re.compile(r"\{\{\s*(\w+)\s*\}\}") def replace_callback(match): var_name = match.group(1) # 字典里找不到对应映射值时,保留原占位符方便排查问题 return str(value_dict.get(var_name, match.group(0))) return placeholder_pattern.sub(replace_callback, qry)
该方案比逐次调用replace的效率更高,且对占位符格式的容错性更好。
实操注意事项
- 传入的映射字典不要命名为
dict,否则会覆盖Python内置的字典构造方法,引发后续代码的隐性错误 - 如果映射值包含用户输入的动态内容,需要提前做SQL转义处理,避免注入风险,不要直接拼接未校验的动态内容到SQL语句中
内容的提问来源于stack exchange,提问作者paranormaldist
相关产品推荐
相关产品推荐

