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

如何编写含:和%的SQL LIKE语句 解决Jinja2模板语法报错

报错根因

报错和SQL语法无关,是你使用的数据库查询链路内置了Jinja2模板渲染逻辑,Jinja2默认将{{、}}识别为变量插值的语法边界标记,你在LIKE语句中写的字面量{{image:%}}刚好命中Jinja2的语法规则,Jinja2尝试解析插值块内的表达式时遇到不符合语法的:,直接抛出模板语法错误。

可行解决方案

根据你的使用场景选任意一种即可:

  • 用Jinja2的raw块包裹不需要解析的字面量内容,块内的所有字符都会被原样输出,不会触发模板语法解析:
query = """
SELECT *
FROM test_db
where text_message LIKE '{% raw %}{{image:%}}{% endraw %}'
"""
  • 如果你需要渲染时动态调整匹配规则,可以把匹配模式作为模板变量传入,避免在模板里直接写{{字面量:
# 提前定义要匹配的字面量模式
like_pattern = "{{image:%}}"
query = """
SELECT *
FROM test_db
where text_message LIKE '{{ like_pattern }}'
"""
# 执行模板渲染时,把like_pattern作为参数传入即可
  • 最推荐的写法是用数据库驱动的参数化查询传值,彻底绕开模板语法冲突,同时避免SQL注入风险:
# SQL语句里用对应驱动支持的参数占位符,不要直接拼接匹配值
query = """
SELECT *
FROM test_db
where text_message LIKE %s
"""
like_pattern = "{{image:%}}"
# 执行查询时把匹配模式作为参数传入,不同驱动的占位符写法可能有区别,比如sqlite用?
cursor.execute(query, (like_pattern,))

注:你当前写的{{image:%}}作为LIKE匹配模式本身符合SQL语法,%通配符可以匹配任意长度的任意字符,刚好满足「以{{image:开头、中间为任意内容、以}}结尾」的匹配需求,不需要调整匹配规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:57:38