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

使用discord.py+Supabase的Discord Bot无法写入用户数据求助

问题排查与解决方案

核心问题分析

1. Supabase响应判断逻辑错误

Supabase执行查询后返回的不是纯列表,而是包含data和error属性的响应对象。你直接判断response == []永远为假,导致插入逻辑从未触发。正确的判断应该检查response.data是否为空列表。

2. 角色数据无法直接序列化

member.roles是discord.Role对象的集合,直接存入数据库会触发序列化错误(可能被静默处理,控制台无输出)。必须转换成可存储的格式,比如角色ID列表或角色名称列表。

3. 成员意图配置缺失

即便代码中用了Intents.all(),仍需在Discord开发者门户的Bot页面,手动开启Server Members Intent,否则guild.members无法获取到服务器内的全部成员数据。

4. 数据库表结构不匹配

  • id字段需设置为主键,且类型为bigint(Discord用户ID是64位整数);
  • role字段需设置为数组类型(比如bigint[]存储ID,或text[]存储名称),对应代码中传入的列表格式。

修改后的代码

import discord
from discord.ext import commands
from supabase import create_client, Client

url: str = "my_url"
key: str = "my_key"
supabase: Client = create_client(url, key)

# 精准配置Intents,避免不必要权限
intents = discord.Intents.default()
intents.members = True  # 必须开启才能获取成员列表
bot = commands.Bot(command_prefix="!", intents=intents)

@bot.event
async def on_ready():
    print("Бот запущен!")
    for guild in bot.guilds:
        for member in guild.members:
            # 将角色转换为ID列表(推荐,ID不会随角色名称变更)
            role_ids = [role.id for role in member.roles]
            post = {
                "id": member.id,
                "username": member.name,
                "nickname": member.display_name,
                "role": role_ids
            }

            # 执行查询并获取有效数据
            response = supabase.table("usersDiscord").select("*").eq("id", member.id).execute()
            # 检查查询结果是否为空
            if not response.data:
                insert_result = supabase.table("usersDiscord").insert(post).execute()
                # 打印调试信息,快速定位问题
                if insert_result.error:
                    print(f"插入用户 {member.id} 失败: {insert_result.error}")
                else:
                    print(f"成功插入用户 {member.id}")

@bot.event
async def on_member_join(member):
    role_ids = [role.id for role in member.roles]
    post = {
        "id": member.id,
        "username": member.name,
        "nickname": member.display_name,
        "role": role_ids
    }

    response = supabase.table("usersDiscord").select("*").eq("id", member.id).execute()
    if not response.data:
        insert_result = supabase.table("usersDiscord").insert(post).execute()
        if insert_result.error:
            print(f"新用户 {member.id} 插入失败: {insert_result.error}")
        else:
            print(f"新用户 {member.id} 已添加")

bot.run("my_token")

额外调试建议

  • 在查询和插入操作后打印response完整内容,比如print(response),直观查看返回结构与错误信息;
  • 查看Supabase控制台的API日志,确认请求是否到达数据库,以及是否有字段不匹配等错误;
  • 核对数据库表usersDiscord的字段名与代码中的键完全一致(比如代码用role,表中不能写成roles)。

内容的提问来源于stack exchange,提问作者zzhuravleff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:33:09