Discord Bot的SQLite数据库更新请求失效,无法同步服务器信息
Discord Bot数据库更新不生效问题排查与修复
问题描述
开发Discord Bot时编写了循环任务,用于检测服务器名称、成员数量等信息变更,但SQLite数据库的更新请求始终不生效。控制台能打印"hello"说明代码执行到了更新调用,但数据库无任何变化,且没有错误提示。
错误分析
1. 参数传递顺序完全不匹配
Main.py中调用database_handler.update_server(server_id, server_name, nb_member),但database_handler.py的update_server方法定义是def update_server(self, server_name : str, server_id : str, nb_member : str)。参数顺序颠倒后,SQL语句的WHERE server_id = ?实际传入的是成员数量值,根本匹配不到目标服务器行,自然不会有更新效果。
2. 循环变量作用域错误
get_serv_info函数中,server_name、server_id、nb_member是在for循环内部赋值,但try代码块在循环外,导致循环结束后只会保留最后一个服务器的信息,仅尝试更新这一个服务器,其他服务器的信息完全没处理。
3. 异常捕获过于宽泛且无错误输出
except:会捕获所有异常,包括参数类型不匹配(比如server.id是整数类型,但方法定义要求传入str)这类问题,但没有打印具体异常信息,导致无法发现潜在的类型错误或其他隐性问题。
修复方案
- 修正参数传递顺序,确保与方法定义一致
- 将try-except块移入for循环内部,逐个处理每个服务器的更新
- 捕获具体异常并打印错误详情,方便调试
- 统一参数类型,比如
server_id使用整数类型(Discord Guild ID本身是整数),避免类型转换问题
修正后的代码示例
Main.py
@bot.event async def on_ready() -> None: print("Bot is ready !") print(f"Logged into {bot.user.name}") print(f"ID : {bot.user.id}") get_serv_info.start() @tasks.loop(seconds=10) # 建议直接在装饰器指定间隔,更规范 async def get_serv_info() -> None: for server in bot.guilds: server_name = server.name server_id = server.id nb_member = server.member_count try: # 修正参数顺序:server_name, server_id, nb_member database_handler.update_server(server_name, server_id, nb_member) print(f"已更新服务器 {server_name} 的信息") except Exception as e: # 打印具体异常信息 print(f"更新服务器 {server_name} 失败: {str(e)}") await asyncio.sleep(10)
database_handler.py
# 修正参数类型:server_id用int,nb_member用int(成员数量是整数) def update_server(self, server_name : str, server_id : int, nb_member : int): cursor = self.connect.cursor() query = "UPDATE Servers SET server_name = ?, nb_member = ? WHERE server_id = ?;" cursor.execute(query, (server_name, nb_member, server_id)) # 打印受影响行数,确认是否命中更新 print(f"更新影响行数: {cursor.rowcount}") cursor.close() self.connect.commit()
额外调试建议
- 查看
update_server中打印的cursor.rowcount,如果值为0,说明WHERE条件没匹配到任何行,需要检查server_id是否与数据库中存储的一致 - 确认数据库中
Servers表的server_id字段类型是否为整数,如果是字符串类型,需要在调用时将server_id转为str,保持类型一致
内容的提问来源于stack exchange,提问作者lxlxtoto
相关产品推荐
相关产品推荐

