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

Python拼接PostgreSQL查询含%报错,如何让Python忽略%字符?

解决Python格式化PostgreSQL查询时%字符的解析错误

问题原因

你使用Python的字符串%格式化语法拼接SQL时,SQL语句中作为通配符的%会被Python误解析为格式化占位符的一部分,导致出现unsupported format character错误。

解决方案

方案1:转义SQL中的%字符

在Python字符串中,用两个连续的%%表示一个字面的%,这样Python格式化时会将%%转换为单个%,同时保留%s作为格式化占位符。

修改后的代码:

sql = """select survey_data
from survey_data.survey_data 
where codigo_do_projeto like '%%s%%'
ORDER BY data_de_inicio_da_coleta desc 
limit %s
offset %s"""

# 执行格式化
formatted_sql = sql % ("目标调查名称", 10, 0)

格式化后生成的SQL会是:

select survey_data
from survey_data.survey_data 
where codigo_do_projeto like '%目标调查名称%'
ORDER BY data_de_inicio_da_coleta desc 
limit 10
offset 0

方案2:使用参数化查询(推荐)

直接用字符串格式化拼接SQL存在SQL注入风险,更安全的方式是使用数据库驱动的参数化查询功能,将通配符逻辑放到参数中,而非SQL语句里。

以psycopg2为例:

import psycopg2

# 建立数据库连接
conn = psycopg2.connect("dbname=你的数据库名 user=你的用户名")
cur = conn.cursor()

survey_name = "目标调查名称"
limit_num = 10
offset_num = 0

# 参数化执行查询,%s是psycopg2的参数占位符
cur.execute("""
    select survey_data
    from survey_data.survey_data 
    where codigo_do_projeto like %s
    ORDER BY data_de_inicio_da_coleta desc 
    limit %s
    offset %s
""", (f"%{survey_name}%", limit_num, offset_num))

# 获取结果
results = cur.fetchall()

# 关闭连接
cur.close()
conn.close()

内容的提问来源于stack exchange,提问作者Eduardo Pitta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:25:38