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
相关产品推荐
相关产品推荐

