为何使用Tuple仍触发sqlite3.ProgrammingError:绑定数量错误?
问题解决:sqlite3.ProgrammingError 参数绑定数量错误
错误根源
你在SQL语句里把参数占位符?放在了双引号内部,导致SQLite无法识别这是一个需要绑定的参数,反而将(?)当作字符串的一部分处理,自然找不到对应的绑定值,触发了参数数量不匹配的报错。
修正后的代码
@tree.command(name='search', description='search for a message by id!', guild=discord.Object(id=1025197159785693284)) async def search(intr: discord.Interaction, id: str): # 移除占位符周围的引号,使用标准参数绑定写法 res = cur.execute('SELECT message FROM messages WHERE id = ?', (id, )).fetchone() # 增加判空逻辑,避免无匹配数据时触发索引错误 if res: await intr.response.send_message(f'message {id} is: {res[0]}') else: await intr.response.send_message(f'No message found with id {id}') # 查询操作无需执行commit,仅写入/修改/删除操作需要 # con.commit() 此行可删除
关键注意事项
- SQLite的参数占位符
?不需要额外添加引号,驱动会自动处理字符串转义与类型转换,同时能防范SQL注入风险。 commit()方法仅用于提交写入、修改、删除类的数据库操作,查询操作完全不需要调用。- 必须增加查询结果的判空处理,否则当目标ID不存在时,
res为None,调用res[0]会引发IndexError。
内容的提问来源于stack exchange,提问作者TacoSnack
相关产品推荐
相关产品推荐

