You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:45:45