PostgreSQL查询返回多条相同数据,Discord机器人排行榜异常是什么原因
问题原因及修复方案
- 异步框架与同步数据库驱动的资源竞争问题
discord.py为异步框架,如果你使用的是同步数据库操作库(如sqlite3、pymysql同步版本),且全局共享同一个数据库连接、游标对象,多个协程并发操作游标时会出现结果覆盖,最终fetchall获取的结果会出现同一行数据重复多次的异常,哪怕数据库本身没有重复记录。
修复方式:每次查询都单独创建连接和游标,使用完成后立即销毁;或者改用对应数据库的异步驱动(如aiosqlite、aiomysql),从根源避免协程竞争资源的问题。 - 查询条件缺失服务器维度过滤
如果你的users表存储了多个Discord服务器的用户数据,当前查询语句没有补充服务器ID的过滤条件,若同一个用户在多个服务器的经验值均为100且排在前列,也会出现返回结果全为该用户的情况。
修复方式:给users表新增guild_id字段存储用户所属的服务器ID,查询时补充过滤逻辑:
cursor.execute("SELECT name, xp FROM users WHERE guild_id = %s ORDER BY xp DESC LIMIT 10;", (ctx.guild.id,))
- 快速排查方法
你可以直接在数据库管理工具中手动执行当前代码里的查询语句:
SELECT name, xp FROM users ORDER BY xp DESC LIMIT 10;
如果手动执行结果正常,可确定是代码中游标/连接的并发使用问题;如果手动执行结果也全是重复数据,说明你此前的用户数据写入/更新逻辑存在bug,导致数据库实际已写入重复记录,和你之前的检查结论不符。
内容的提问来源于stack exchange,提问作者Hallteon
相关产品推荐
相关产品推荐

