Django原生查询中含空格字符串的参数绑定错误问题咨询
解决Django原生查询参数数量不匹配的错误
嘿,我来帮你搞定这个问题!你遇到的错误根源其实很直白:你手动给第一个占位符加了单引号,这直接让Django的SQL解析器搞混了占位符的数量。
错误原因解析
在Django的raw()查询里,完全不需要给%s占位符手动加单引号。Django会自动根据参数的类型(比如字符串)来处理引号和转义,既保证SQL语法正确,还能帮你防范SQL注入风险。
你写的SQL语句:
select * from tablename where city='%s' and state=%s
这里的'%s'会被SQL解析器当成一个普通的字符串字面量,而不是占位符。它只会识别到后面的state=%s这1个有效占位符,但你传了2个参数,自然就会弹出"Incorrect number of bindings supplied"的错误提示。
正确的写法
把多余的单引号去掉,直接用%s作为占位符就行:
ModelName.objects.raw("select * from tablename where city=%s and state=%s", params=['San francisco', 'Los Angeles'])
执行时Django会自动给字符串参数'San francisco'加上单引号,生成合法的SQL语句,同时还会处理特殊字符的转义,彻底规避SQL注入的风险。
额外提醒
永远别手动拼接SQL字符串或者给占位符加引号,这不仅容易引发语法错误,还会带来严重的安全隐患。依赖Django的参数化查询机制才是最稳妥的做法。
内容的提问来源于stack exchange,提问作者S Mev
相关产品推荐
相关产品推荐

