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

如何在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控制台中配置计算字段
    1. 进入foo表的Computed Fields选项卡
    2. 点击Add Computed Field,选择你刚创建的get_bar_from_foo函数
    3. 设置返回类型为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中跟踪这个视图并创建关系
    1. 进入Hasura控制台的Data选项卡,点击Track View,选择foo_with_bar_id
    2. 进入foo_with_bar_id视图的Relationships选项卡,点击Add Relationship
    3. 选择Object Relationship,命名为bar,关联到bar表的id字段和视图的bar_id字段
      之后你就可以像普通表一样查询关联数据了:
    query {
      foo_with_bar_id {
        id
        bar {
          id
        }
      }
    }
    
关键注意事项
  • 类型转换必须匹配:JSONB提取的是文本类型(text),一定要转换为和bar.id完全一致的类型(比如integer、uuid等),否则关联会失败。
  • 函数稳定性:用计算字段时,函数必须标记为STABLE或IMMUTABLE,Hasura不允许使用VOLATILE函数作为计算字段。
  • 方法选择:
    • 计算字段适合简单的关联查询,不需要额外的视图维护;
    • 视图适合需要对提取出的外键字段进行过滤、排序,或者创建多个关系的场景。

内容的提问来源于stack exchange,提问作者Viktor Hedefalk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:22:33