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
相关产品推荐
相关产品推荐

