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

运行SQLite插入代码报sqlite3.ProgrammingError绑定参数数量错误如何解决

问题分析与解决方案

报错原因

触发的错误信息:sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 4 supplied.

  • 核心错误:SQL语句占位符不符合sqlite3的参数化规则。你写的插入语句用了带单引号的%s作为占位符,sqlite3会将其识别为普通字符串内容,不会判定为待绑定的参数位,因此系统认为该语句不需要传入任何参数,但你向execute方法传入了包含4个元素的元组,参数数量不匹配触发报错。
  • 隐性错误:插入语句操作的表名为users_db,后续查询语句操作的表名为users,表名不一致会导致后续查询抛出表不存在的异常。另外代码没有执行commit操作,插入的数据不会持久化保存到数据库文件中。

修复方案

方案1(推荐):使用sqlite3标准参数化占位符

使用?作为参数占位符,不需要手动加引号,sqlite3会自动处理参数类型转义、防SQL注入,修正后代码如下:

import sqlite3
database = sqlite3.connect("users.db")
cursor = database.cursor()
data = ("first", "last", "email", "True")
print(data)
# 用?作为占位符,无需加引号,参数传入execute第二个参数
cursor.execute("INSERT INTO users_db VALUES(?,?,?,?)", data)
# 统一表名,根据实际表名调整,这里和插入的表名保持一致
data = cursor.execute("SELECT * FROM users_db")
print(data.fetchall())
# 写入操作必须提交才会持久化到数据库
database.commit()
database.close()

方案2(不推荐,仅作演示):直接使用Python字符串格式化拼接

如果一定要用%s格式化,直接把参数拼接到SQL字符串中,不要传给execute的第二个参数,该写法有SQL注入风险,生产环境禁止使用:

# 不安全的写法,仅作错误原因演示
cursor.execute("INSERT INTO users_db VALUES('%s','%s','%s','%s')" % data)

内容的提问来源于stack exchange,提问作者Abhimanyu Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:15:06