如何在Supabase中通过JSONB字段的usertag查询用户?
解决Supabase查询JSONB字段中usertag返回null的问题
错误原因
你遇到的column users.usertag does not exist报错,是因为查询条件的语法错误:eq('usertag: admin_data->>usertag', usertag)这种写法会让PostgreSQL误以为你要查询名为usertag的物理列,但你的表中只有admin_data这个JSONB字段,usertag是它内部的嵌套属性,因此语法完全不符合要求。
修正后的查询函数
async function queryUserByUsertag(usertag) { try { const { data, error } = await supabase .from('users') .select('*') // 正确指向JSONB字段admin_data中的usertag属性 .eq('admin_data->>\'usertag\'', usertag); if (error) { console.error('Error querying users:', error.message); return null; } if (data && data.length > 0) { return data[0]; } else { throw new Error('User not found'); } } catch (error) { console.error('Error fetching user by usertag:', error.message); return null; } }
可选优化方案
既然你提到usertag是用户独有的唯一标识,可以使用Supabase提供的single()方法直接返回单个对象,避免手动取data[0]:
async function queryUserByUsertag(usertag) { try { const { data, error } = await supabase .from('users') .select('*') .eq('admin_data->>\'usertag\'', usertag) .single(); // 直接返回单个记录,无匹配数据时会主动抛出错误 if (error) { console.error('Error querying users:', error.message); return null; } return data; } catch (error) { console.error('Error fetching user by usertag:', error.message); return null; } }
关键语法说明
在PostgreSQL(Supabase基于它构建)中:
->>:用于提取JSONB字段的文本值,返回结果为字符串类型,正好匹配你传入的usertag字符串参数- 如果需要提取JSON格式的原始值,使用
->操作符即可,但这里usertag是字符串类型,->>更适配查询场景
内容的提问来源于stack exchange,提问作者7Wdev
相关产品推荐
相关产品推荐

