You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)这类问题,但没有打印具体异常信息,导致无法发现潜在的类型错误或其他隐性问题。

修复方案

  1. 修正参数传递顺序,确保与方法定义一致
  2. 将try-except块移入for循环内部,逐个处理每个服务器的更新
  3. 捕获具体异常并打印错误详情,方便调试
  4. 统一参数类型,比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:05:24