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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:58:30