You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 12:36:02