Supabase新增用户时数据库报错问题求助
问题分析与解决
错误根源
你在触发器中使用new.raw_user_meta_data ->> 'favorites'获取的值是文本格式的JSON数组(例如字符串"[]"),但public.users表的favorites列是PostgreSQL的原生数组类型(比如uuid[]或text[]),两者类型不兼容,插入时会触发类型转换错误,导致触发器执行失败,最终抛出“Database error saving new user”。
->>操作符的作用是从JSON字段提取值并转为text类型,而你需要将JSON数组转为PostgreSQL原生数组,必须用对应的类型转换逻辑。
验证与修复步骤
1. 确认favorites列类型
先执行以下SQL检查列定义:
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'favorites';
根据返回的类型(text[]或uuid[])选择对应修复方案。
2. 修改触发器函数
场景1:favorites是text[]类型
create or replace function public.handle_new_user () returns trigger language plpgsql security definer as $$ begin insert into public.users (id,full_name,avatar,favorites) values ( new.id, new.raw_user_meta_data ->> 'fullName', new.raw_user_meta_data ->> 'avatar', -- 将JSON数组转为text数组 array(select jsonb_array_elements_text(new.raw_user_meta_data -> 'favorites')) ); return new; end; $$;
场景2:favorites是uuid[]类型(收藏帖ID通常为UUID)
create or replace function public.handle_new_user () returns trigger language plpgsql security definer as $$ begin insert into public.users (id,full_name,avatar,favorites) values ( new.id, new.raw_user_meta_data ->> 'fullName', new.raw_user_meta_data ->> 'avatar', -- 将JSON数组转为uuid数组 array(select (jsonb_array_elements_text(new.raw_user_meta_data -> 'favorites'))::uuid) ); return new; end; $$;
3. 额外兼容处理
如果raw_user_meta_data中可能不存在favorites字段,可添加默认空数组的逻辑:
-- 以text[]为例 coalesce(array(select jsonb_array_elements_text(new.raw_user_meta_data -> 'favorites')), '{}'::text[])
内容的提问来源于stack exchange,提问作者Niv G.
相关产品推荐
相关产品推荐

