Django执行原生SQL时用%d传整数ID参数报错,换%s正常是什么原因?
Django原生SQL使用
%d占位符报错原因解析 根本原因
Django 中cursor.execute的参数占位符规则和普通Python字符串%格式化的规则完全是两套逻辑:
- 普通Python字符串格式化(比如
"id为%d" % 1)中,确实遵循%d对应整数、%s对应字符串的规则,整个字符串的拼接在Python层完成。 - 但
cursor.execute采用的是参数化查询机制,符合PEP 249 Python数据库API规范,不管传入参数是整数、字符串、布尔值还是其他类型,统一要求使用%s作为占位符,参数的类型转换、特殊字符转义都由底层数据库驱动自动处理,不需要开发者手动区分参数类型适配不同占位符。
报错逻辑
你使用%d作为占位符时,数据库驱动不会将其识别为参数占位符,会直接把%d当做SQL语句的原文提交给数据库解析,数据库执行时碰到%符号无法识别对应语法,就抛出了你收到的near "%": syntax error报错。
补充说明
你确认的id字段为整数类型的表结构和本次报错无关,无论传参是什么类型,在cursor.execute的SQL语句中都统一使用%s做占位符即可,这种机制同时也能有效避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

