如何编写含:和%的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
相关产品推荐
相关产品推荐

