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

Supabase RPC函数操作JSONB报错:JSON输入语法无效

问题解决:Supabase RPC追加JSONB数组报错(invalid input syntax for type json)

错误根源

你的RPC函数里用双引号包裹jsonb_build_object的键名("id"、"name"),在PostgreSQL中双引号是用来引用数据库标识符(比如列名、表名)的,不是字符串。这会导致PostgreSQL把"id"当成列名解析,而非JSON对象的键,最终生成的JSON格式完全错误,触发22P02语法报错。另外,你提供的RPC代码缺失了参数声明部分,这也是函数无法正确接收传入值的潜在问题。

修正后的RPC函数代码

CREATE OR REPLACE FUNCTION add_guild_channel(p_guild_id text, channel_id text, channel_name text)
RETURNS VOID AS $$
DECLARE
  channels JSONB;
BEGIN
  -- 获取目标公会的现有频道数据
  SELECT guild_channels INTO channels FROM guilds WHERE guild_id = p_guild_id;

  -- 追加新频道到数组(用单引号包裹JSON键名)
  channels = COALESCE(channels, '[]'::JSONB) || jsonb_build_object('id', channel_id, 'name', channel_name);

  -- 更新公会频道数据
  UPDATE guilds SET guild_channels = channels WHERE guild_id = p_guild_id;
END;
$$ LANGUAGE plpgsql;

核心修正点

  • 键名改用单引号:jsonb_build_object('id', channel_id, 'name', channel_name),确保PostgreSQL将'id'、'name'识别为JSON对象的字符串键。
  • 补全参数声明:在函数开头明确声明输入参数的类型(可根据你的表结构调整类型,比如guild_id是bigint就改成对应类型)。

额外优化(可选)

如果要避免重复添加同一频道,可在追加前做存在性检查:

-- 替换原追加逻辑
IF NOT (channels @> jsonb_build_object('id', channel_id)) THEN
  channels = COALESCE(channels, '[]'::JSONB) || jsonb_build_object('id', channel_id, 'name', channel_name);
END IF;

调用代码验证

你的Discord机器人调用代码没有问题,确保Supabase客户端初始化正确,且传入参数类型和RPC函数声明的一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:54