Python中如何分步格式化带占位符的SQL字符串?
SQL分步替换占位符的正确姿势
你说的第二次.format()没生效,大概率是初始模板的转义写法错了,给你几个靠谱的分步实现方式:
双大括号转义的正确写法
这是最标准的分步格式化方式,把需要后续替换的占位符用双大括号包裹,第一次格式化时单大括号的{table}会被替换,双大括号的{{field}}会自动转成单大括号{field}保留下来,供第二次格式化使用:
# 初始模板:field用双大括号转义,table用单大括号 sql_template = "SELECT {{field}} FROM {table}" # 第一步替换表名 temp_sql = sql_template.format(table="user_info") # 此时temp_sql结果:"SELECT {field} FROM user_info" # 第二步替换字段 final_sql = temp_sql.format(field="username, age, email") # 最终结果:"SELECT username, age, email FROM user_info"
要是你之前这么写还没生效,检查下是不是初始模板里的{{field}}写成了{field}——如果是单大括号,第一次格式化时会因为找不到field参数报错;要是不小心多写了一层括号(比如{{{field}}}),转义后会变成{field}的错误格式,也会导致第二次格式化失效。
其他替代方案
如果觉得双大括号容易搞混,也可以用自定义占位符+字符串替换:
# 用[field]当临时占位符,和{table}区分开 sql_template = "SELECT [field] FROM {table}" temp_sql = sql_template.format(table="user_info") final_sql = temp_sql.replace("[field]", "id, create_time")
或者用字典分步存参数,最后一次性格式化(适合需要攒齐参数再生成SQL的场景):
sql_params = {} # 第一步存表名 sql_params["table"] = "order_list" # 后续再存字段 sql_params["field"] = "order_id, total_price" final_sql = "SELECT {field} FROM {table}".format(**sql_params)
内容的提问来源于stack exchange,提问作者EAA
相关产品推荐
相关产品推荐

