Discord机器人Cog加载报错:setup()缺失ctx和message参数
Discord机器人Economy Cog问题修复指南
一、核心错误:setup()参数不匹配
你收到的setup()缺少2个必需参数错误,是因为discord.py加载扩展时,setup函数只需要接收bot这一个参数,你额外添加的ctx和message完全多余,导致调用时参数不匹配。
修复后的setup函数:
async def setup(bot): await bot.add_cog(EconCog(bot)) print("Economy cog has been loaded successfully!")
二、addtokens命令的参数逻辑错误
- 命令定义里的
message参数是冗余的,discord.py命令的第一个固定参数是ctx,要指定目标用户应该用member: discord.Member作为参数,而非message。 ctx.send()必须加await,否则会触发协程未执行的错误。- 你当前的逻辑没有处理用户已存在的情况,直接插入会导致主键冲突(后续优化表结构后)。
修复后的addtokens命令示例:
@commands.command() async def addtokens(self, ctx, member: discord.Member, number: int = None): if ctx.author.guild_permissions.ban_members: if number is None: await ctx.send("请输入要添加的代币数量") return db = sqlite3.connect("economy.sqlite") cursor = db.cursor() # 先查询用户是否已存在于数据库 cursor.execute("SELECT Tokens FROM economy WHERE user_id = ?", (member.id,)) result = cursor.fetchone() if result: # 用户存在则更新代币数量 cursor.execute("UPDATE economy SET Tokens = Tokens + ? WHERE user_id = ?", (number, member.id)) else: # 用户不存在则插入新记录 cursor.execute("INSERT INTO economy(user_id, Tokens, Weapons) VALUES (?, ?, ?)", (member.id, number, "")) db.commit() await ctx.send("操作完成!") cursor.close() db.close() else: await ctx.send("想多了,你没有执行这个操作的权限。")
三、SQLite代码的问题与优化
- 建表语句语法错误:原SQL最后一列后多了一个逗号,会触发语法错误:
-- 错误写法 CREATE TABLE IF NOT EXISTS economy( Tokens INTEGER, Weapons TEXT, user_id INTEGER, -- 这里的逗号要删除 )
修复并优化(添加主键和默认值):
CREATE TABLE IF NOT EXISTS economy( Tokens INTEGER DEFAULT 0, Weapons TEXT DEFAULT "", user_id INTEGER PRIMARY KEY -- 设为主键,避免同一用户重复插入 )
- SQL注入风险:不要用字符串拼接SQL(
f"SELECT ... {author.id}"),必须用?占位符做参数化查询,这是数据库操作的标准安全做法。 - 列数不匹配错误:原插入语句中,SQL只指定了2个列,但你传入了3个值(比如
(author.id, 0, 0)),会直接触发执行错误。
四、其他细节问题
on_ready事件会在机器人每次重连时触发,建表逻辑可以保留,但建议把数据库连接的逻辑封装成工具函数,避免重复代码。removetokens命令目前只有权限判断,没有具体的代币移除逻辑,可以参考addtokens的逻辑实现,同样使用参数化查询。
内容的提问来源于stack exchange,提问作者Sten
相关产品推荐
相关产品推荐

