在 Hasura 中创建数组

Avatar of Sarah Drasner
Sarah Drasner

DigitalOcean 为您旅程的每个阶段提供云产品。从 200 美元的免费额度 开始!

Hasura 是我创建应用程序托管 GraphQL API 的最喜爱方式之一。我发现它既简单直观,又适用于各种用例。但是,自从使用 Hasura 以来,我反复看到同一个问题:我们应该如何创建数组?鉴于在行的“类型”下拉列表中未提供arraymap,那么完成此操作的最佳方法是什么?

实际上,Hasura 可以通过几种不同的方式来捕捉数组的概念,以下是对解决此问题的方法的细分。我个人比较喜欢我们即将介绍的最后一个选项 JSONB,但我们会逐步介绍其他选项,以防您想尝试其他方法,因为每个选项都有略微不同的优势。

方法 1:手动创建字面量数组

Hasura 不提供“array”作为type,但我们可以通过选择“文本”并在末尾添加方括号来创建字符串数组,如下所示

我们得到的是text[],并且将提示我们通过以下两种方式之一创建数组

["one", "two"] 
// or 
{"one", "two"}
insertion of row with type {"foo", "bar"} or ["foo", "bar"]

方法 2:创建关系

我们还可以与另一个包含一系列文本元素的表创建关系。为此,请创建一个具有文本类型的行。

我们还将通过侧边栏中的“添加表”按钮创建一个新表,并创建一个非常简单的行,其中包含我们需要的数据类型(文本、整数或任何其他类型)的唯一键。

现在,点击“关系”选项卡。在表中,选择“数组关系”选项,为其命名,并引用创建的原始表。

第一个表的id应该与我们刚刚创建的第二个表的id具有关系。

保存后,您应该会看到关系选项卡中的表中反映了数组关系,箭头表示关系的方向。

users.gameId → favoriteGames.id

现在,我们可以在“GraphiQL”选项卡中查找数组

方法 3:JSONB

以下是我们在 Hasura 中创建数组的最喜爱方法之一。我喜欢它,因为它可以非常高效。我们可以使用“JSONB”类型,并通过从下拉列表中选择 JSONB 来创建数组。然后,将以与text[]选项类似的方式提示我们

填写后,它将如下所示

从那里,我们不仅可以像上面那样将数组添加到查询中,还可以通过多个索引按标签进行搜索,并且它们的 GraphiQL 选项卡使其易于浏览。请查看我何时按包含“动画”的内容过滤标签

query MyQuery {
  codesamples(where: {tags: {_contains: "animation"}}) {
    userId
    name
    id
  }
}

但是,这样的查找不一定一开始就高效,尤其是在数据量很大的情况下。幸运的是,我们可以定义要索引的字段。从顶部的“数据”选项卡中,选择侧面板中的“SQL”组,在该区域中,我们可以定义要索引的字段以维护高效的查找。在此示例中,我们将为“标签”字段创建索引

create index codesample_gin on codesamples using gin(tags)

这将运行查询并索引此查找,使其在将来更高效。

总结

Hasura 提供了绝佳的开发者体验,可以设置快速易用的 GraphQL API。对于那些有兴趣使用 Hasura 设置数组的人,我希望本文对您有所帮助。

感谢 Hasura 的 Adron Hall 校对本文。