如何在Python字符串格式化时避免为SQL关键字添加引号?
解决方案
问题根源在于你用Python元组包装内容后调用str(tup),Python会自动为字符串类型元素添加引号,导致ARRAY[...]被识别为字符串字面量而非SQL关键字。要解决这个问题,需要直接构建符合SQL语法的字符串片段,而非依赖Python元组的默认字符串转换逻辑。
修正后的代码如下:
import json # 示例数据 test_dict = json.loads( json.dumps( [ { "parameter_1": ["blah", "25"], "parameter_2": "test_group_1", "parameter_3": "243", }, { "parameter_1": ["blah2", "12"], "parameter_2": "test_group_2", "parameter_3": "21", }, ] ) ) list_of_sql_tuples = [] for item in test_dict: # 处理数组部分:给每个元素添加单引号,拼接成ARRAY关键字格式 array_elements = ", ".join(f"'{elem}'" for elem in item["parameter_1"]) array_part = f"ARRAY[{array_elements}]" # 处理普通字符串参数:手动添加单引号 param2 = f"'{item['parameter_2']}'" param3 = f"'{item['parameter_3']}'" # 组装单个SQL元组字符串 sql_tuple = f"({array_part}, {param2}, {param3})" list_of_sql_tuples.append(sql_tuple) # 拼接所有元组 formatted_tuples = ",".join(list_of_sql_tuples) # 代入SQL模板(示例模板) sql_query_template = "INSERT INTO target_table VALUES {}" print(sql_query_template.format(formatted_tuples))
核心逻辑说明
- 直接构建
ARRAY[...]的SQL语法片段,避免将其作为Python字符串元素被自动添加引号 - 手动为需要作为SQL字符串字面量的参数添加单引号,确保SQL语法符合要求
- 跳过Python元组的字符串转换步骤,完全自主控制输出格式
安全提示
如果参数来自不可信外部来源,直接字符串拼接存在SQL注入风险。这种情况下建议使用Presto对应的Python驱动提供的参数化查询功能,替代手动字符串格式化。
内容的提问来源于stack exchange,提问作者Cuttles
相关产品推荐
相关产品推荐

