在Supabase中向JSON数组列插入JSON对象遇报错求助
解决Supabase更新JSON数组列报错的问题
核心问题
你误用了insert方法,实际需求是更新已存在的用户记录而非创建新用户。insert会尝试插入新行,既不符合需求,还会因主键(id)重复触发错误,同时也没解决JSON数组的类型匹配问题。
正确实现方式
由于sites是JSON数组类型,要向数组中添加新JSON对象,需结合PostgreSQL的JSON数组操作函数,配合Supabase的update方法:
情况1:sites列类型为jsonb(推荐使用的JSON类型)
使用jsonb_array_append函数追加对象,同时处理列初始值为null的情况(避免报错):
const newSiteConfig = { /* 你的配置对象,例如 name: '我的站点', url: 'https://example.com' */ }; const { data, error } = await supabase .from("users") .update({ // 用coalesce将null转为空数组,再追加新对象 sites: `jsonb_array_append(coalesce(sites, '[]'::jsonb), '${JSON.stringify(newSiteConfig)}'::jsonb)` }) .eq("id", user?.id); if (error) console.error(error); else console.log("配置已成功添加");
更安全的参数化写法(避免SQL注入)
如果配置对象包含用户输入,建议用Supabase的rpc调用函数,避免手动拼接JSON:
const newSiteConfig = { /* 你的配置对象 */ }; const { data, error } = await supabase .from("users") .update({ sites: supabase.rpc('jsonb_array_append', [supabase.raw('sites'), newSiteConfig]) }) .eq("id", user?.id);
情况2:sites列类型为json[](普通JSON数组)
使用PostgreSQL的array_append函数:
const newSiteConfig = { /* 你的配置对象 */ }; const { data, error } = await supabase .from("users") .update({ sites: supabase.rpc('array_append', ['sites', newSiteConfig]) }) .eq("id", user?.id);
额外说明
- 若你需要覆盖整个
sites数组(而非追加),可直接赋值数组,但仍需使用update:const { data, error } = await supabase .from("users") .update({ sites: [newSiteConfig] }) .eq("id", user?.id); - 确认
sites列类型:在Supabase控制台的表编辑器中查看列类型,根据json[]或jsonb/jsonb[]选择对应函数。
内容的提问来源于stack exchange,提问作者Chris McGlynn
相关产品推荐
相关产品推荐

