discord.py开发Discord等级机器人时Bot对象无db属性报错解决
解决AttributeError: 'Bot' object has no attribute 'db'错误
你的问题核心是数据库初始化逻辑没有被正确执行,导致bot.db从未被赋值,触发属性不存在的错误。下面是具体修复步骤:
1. 让初始化上下文管理器生效
你定义了initialise异步上下文管理器,但没有将它绑定到Bot的启动流程中。有两种简单的修复方式:
方式一:创建Bot时指定上下文管理器
修改Bot实例的创建代码,添加async_context_manager参数,让Bot启动时自动执行初始化逻辑:
bot = commands.Bot(command_prefix='!', intents=intents, async_context_manager=initialise)
方式二:手动用异步上下文包裹Bot启动
如果你的discord.py版本不支持async_context_manager参数,改用asyncio.run包裹启动逻辑:
import asyncio async def main(): async with initialise(), bot: await bot.start("你的机器人TOKEN") asyncio.run(main())
注意:替换原来直接调用bot.run("TOKEN")的代码
2. 修复SQL语句的语法错误
你原有的INSERT语句存在语法错误,参数不应该直接写在SQL字符串里,正确写法是将参数作为第二个参数传入execute方法:
# 错误写法 # cursor = await bot.db.execute("INSERT OR IGNORE INTO guildData (guild_id,user_id,exp) VALUES(?,?,?),(message.guild.id,message.author.id,1)) # 正确写法 cursor = await bot.db.execute( "INSERT OR IGNORE INTO guildData (guild_id,user_id,exp) VALUES(?,?,?)", (message.guild.id, message.author.id, 1) ) # 记得提交事务 await bot.db.commit()
这样既修复了语法问题,也避免了SQL注入风险。
额外检查点
- 确保
aiosqlite已正确安装:执行pip install aiosqlite确认依赖存在 - 初始化完成后,可以在
on_ready事件里打印日志验证bot.db是否存在:@bot.event async def on_ready(): print(f"Logged in as {bot.user}") print(f"Database connected: {hasattr(bot, 'db')}")
内容的提问来源于stack exchange,提问作者Meme410
相关产品推荐
相关产品推荐

