在Django中执行含ILIKE子句的原生SQL查询遇问题求助
Django原生SQL中ILIKE子句的正确执行写法
针对Django原生SQL里的ILIKE模糊查询,推荐两种可靠的写法:
方法1:在参数中拼接通配符(推荐)
直接把通配符%和搜索值组合后作为参数传入,SQL语句仅保留占位符%s:
cursor.execute("SELECT cc.name FROM customer cc WHERE name ILIKE %s", ["%jan%"])
这种方式由Django自动处理参数的引号和转义,既避免了语法错误,也能有效防止SQL注入。
方法2:在SQL语句中使用转义的通配符
如果需要在SQL里写通配符,要注意Python字符串中%%会被解析为单个%,同时确保参数用元组形式传入:
cursor.execute("SELECT cc.name FROM customer cc WHERE name ILIKE '%%%s%%'", ("jan",))
错误原因分析
你之前尝试的写法都存在语法冲突问题:
- 写法
'%%%s%%'搭配列表参数时,Python会先把%%转成%,再替换参数jan,最终SQL变成'%'jan'%',引号不匹配导致语法错误。 - 直接写
%%%s%%不加引号时,会生成%'jan'%'这类非法语法。 - 仅用
%s不添加通配符时,查询会变成精确匹配'jan',不符合模糊查询需求。
内容的提问来源于stack exchange,提问作者Carlos Rojas
相关产品推荐
相关产品推荐

