Gorm含%通配符的LIKE查询传参报错expected 0 arguments, got 1
问题根因
GORM 的参数占位符 ? 只要被单引号包裹,就不会被SQL解析器识别为待绑定参数——单引号包裹的内容属于SQL标准定义的字符串字面量,ORM 不会对字面量内部的字符做参数替换,避免破坏字符串语义、引发SQL注入风险。
你写的 '%?%' 中,? 完全处于单引号内部,解析器会把它当成普通的问号字符处理,判定这条Where子句不需要传入任何绑定参数,此时你额外传入 nameSearch 参数,就会直接抛出 expected 0 arguments, got 1 错误。
硬编码固定值的写法能正常运行,是因为这条语句本身没有声明需要绑定参数,你也没有传入额外参数,参数数量匹配,自然不会报错。
你之前编写的其他同类Where条件没有触发问题,核心原因是那些语句里的 ? 都没有被单引号包裹,属于SQL语法层面的独立占位符,可以被解析器正常识别。
修复方案
不要把模糊匹配的 % 通配符写在SQL字符串中包裹占位符,将通配符和搜索值在Go代码侧拼接完成后,再传给独立的占位符即可:
- 全版本兼容通用写法:
db = db.Where("LOWER(name) LIKE LOWER(?)", "%"+nameSearch+"%")
- PostgreSQL专属简化写法(利用PG原生的
ILIKE语法实现大小写不敏感匹配,省略两边的LOWER函数,性能更好):
db = db.Where("name ILIKE ?", "%"+nameSearch+"%")
注意:不要为了省事直接把用户输入拼接进SQL字符串(比如写成
"LOWER(name) LIKE LOWER('%" + nameSearch + "%')"),这种写法会绕过GORM的参数转义逻辑,存在SQL注入风险。
内容的提问来源于stack exchange,提问作者robcxyz
相关产品推荐
相关产品推荐

