如何在Hasura中使用PostgreSQL jsonb字段中的外键?
当然可以实现!Hasura虽然在界面上不直接支持从嵌套JSONB字段创建对象关系,但我们可以通过两种常用方式绕开这个限制——计算字段(Computed Fields)或者数据库视图,下面给你详细拆解步骤:
方法一:使用计算字段(Computed Field)
这种方法是通过PostgreSQL函数提取JSONB里的外键并关联目标表,再让Hasura把这个函数暴露为GraphQL字段:
- 第一步:在PostgreSQL中创建一个稳定函数,接收
foo表的行,返回对应的bar记录
这里一定要标记函数为CREATE OR REPLACE FUNCTION get_bar_from_foo(f foo) RETURNS bar AS $$ SELECT * FROM bar WHERE id = (f.data -> 'baz' ->> 'barId')::integer; -- 注意类型转换,要和bar.id的类型匹配 $$ LANGUAGE sql STABLE;STABLE,因为Hasura需要知道这个函数的输出不会随时间变化(除非输入行改变),这样才能安全地将其作为GraphQL字段使用。 - 第二步:在Hasura控制台中配置计算字段
- 进入
foo表的Computed Fields选项卡 - 点击Add Computed Field,选择你刚创建的
get_bar_from_foo函数 - 设置返回类型为
bar(如果Hasura没自动识别,手动选择)
配置完成后,你就可以在GraphQL查询中直接通过这个字段关联bar数据了,比如:
query { foo { id get_bar_from_foo { id } } } - 进入
方法二:创建数据库视图
如果需要基于这个JSONB外键做过滤、排序,或者创建多种关系,视图会更灵活:
- 第一步:创建一个包含提取后外键字段的视图
CREATE VIEW foo_with_bar_id AS SELECT f.*, (f.data -> 'baz' ->> 'barId')::integer AS bar_id -- 提取并转换为普通字段 FROM foo f; - 第二步:在Hasura中跟踪这个视图并创建关系
- 进入Hasura控制台的Data选项卡,点击Track View,选择
foo_with_bar_id - 进入
foo_with_bar_id视图的Relationships选项卡,点击Add Relationship - 选择Object Relationship,命名为
bar,关联到bar表的id字段和视图的bar_id字段
之后你就可以像普通表一样查询关联数据了:
query { foo_with_bar_id { id bar { id } } } - 进入Hasura控制台的Data选项卡,点击Track View,选择
关键注意事项
- 类型转换必须匹配:JSONB提取的是文本类型(
text),一定要转换为和bar.id完全一致的类型(比如integer、uuid等),否则关联会失败。 - 函数稳定性:用计算字段时,函数必须标记为
STABLE或IMMUTABLE,Hasura不允许使用VOLATILE函数作为计算字段。 - 方法选择:
- 计算字段适合简单的关联查询,不需要额外的视图维护;
- 视图适合需要对提取出的外键字段进行过滤、排序,或者创建多个关系的场景。
内容的提问来源于stack exchange,提问作者Viktor Hedefalk
相关产品推荐
相关产品推荐

