如何解决discord.py bot在SQLite数据库中计数异常递增的问题
Discord.py Bot SQLite计数异常修复:所有消息触发递增的问题
问题现象
给Discord.py Bot接入SQLite数据库后,做了个趣味功能——用户发送brilliant或brilliant!时,给该用户的计数加1。但出现异常:
- 发送一次目标内容会多次递增计数
- 未发送过目标内容的用户也被统计进数据库
原问题代码
import discord, sqlite3 from discord.ext import commands class brilliant_count(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_message(self, message): if message.author == self.bot.user: return if message.content.lower() == "brilliant" or "brilliant!": conn = sqlite3.connect(r"./cogs/brilliant_count.db") c = conn.cursor() # 获取用户数据 user = message.author # 检查用户是否已在数据库中 c.execute("SELECT count FROM brilliant_counter WHERE discord_id=?", (user.id,)) result = c.fetchone() if result is None: # 用户未在库中,添加初始计数1 c.execute("INSERT INTO brilliant_counter (discord_id, discord_username, count) VALUES (?, ?, ?)", (user.id, user.name, 1)) else: # 用户已在库中,递增计数 count = result[0] count += 1 c.execute("UPDATE brilliant_counter SET discord_username=?, count=? WHERE discord_id=?", (user.name, count, user.id)) # 提交数据库修改 conn.commit() # 关闭数据库连接 conn.close() async def setup(bot): await bot.add_cog(brilliant_count(bot))
排查过程
最初误以为是on_message监听器因Bot加入多服务器被多次触发,尝试给消息添加自定义processed标记来避免重复处理:
if message.content.lower() == "brilliant" and not message.processed: message.processed = True
但Discord.py的Message对象并没有processed属性,该方法无效。
最终修复方案
问题出在条件判断的逻辑错误:
原错误条件:
if message.content.lower() == "brilliant" or "brilliant!":
由于or右侧的"brilliant!"是非空字符串,在Python中会被判定为True,导致所有消息都会触发计数逻辑。
修正为分别判断两个目标字符串:
if (message.content.lower() == "brilliant") or (message.content.lower() == "brilliant!"):
这样只有当消息内容严格匹配brilliant或brilliant!时,才会执行计数递增操作,异常问题解决。
内容的提问来源于stack exchange,提问作者gfran
相关产品推荐
相关产品推荐

