【问题标题】:Using Postgres FK from jsonb with Hasura?使用来自 jsonb 的 Postgres FK 和 Hasura?
【发布时间】:2021-02-02 05:20:20
【问题描述】:

我们在 postgres 的 json blob 中有外键。我们像这样加入这些:

SELECT f.id, b.id FROM foo AS f
  LEFT JOIN bar AS b ON f.data -> 'baz' ->> 'barId' = text(b.id)

我现在正在尝试使用 Hasura 进行 som graphql 查询,我需要这些作为对象关系。在 UI 中,我只能尝试手动添加与普通列的关系,而不是嵌套的 json 数据:

是否有可能通过这种方式获得graphql关系?

【问题讨论】:

标签: postgresql graphql jsonb hasura


【解决方案1】:

我在 cmets 中得到了答案,谢谢@iamnat。为了清楚起见,我将在这里以我的示例进行演变,因为我仍然有些挣扎:

超级简单的架构和数据:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE foo
(
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    name text,
    data jsonb NOT NULL
);

CREATE TABLE bar
(
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    name text,
);

WITH bars AS (
  INSERT INTO bar (name) VALUES ('bar') RETURNING id
)
INSERT INTO foo (name, data) VALUES ('foo', jsonb_build_object('barId', (SELECT id FROM bars)));

然后我可以为关系创建一个函数:

CREATE FUNCTION foo_bar(foo_row foo)
RETURNS SETOF bar AS $$
  SELECT *
  FROM bar
  WHERE text(id) = foo_row.data ->> 'barId'
$$ LANGUAGE sql STABLE;

然后我可以在 Hasura 中将其用作“数据”-> foo -> 修改-> 计算域->“添加新计算域”下的计算域。只需给它一个名称并在下拉列表中引用该函数:

然后我可以查询:

query MyQuery {
  foo {
    name
    foo_bar {
      name
    }
  }
}

预期结果:

{
  "data": {
    "foo": [
      {
        "name": "foo",
        "foo_bar": [
          {
            "name": "bar"
          }
        ]
      }
    ]
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多