我尝试使用Hasura在PostgreSQL中通过GraphQL询问,并接收了JSON

由于feedly上出现了广告,所以我尝试使用了一个叫做Hasura的东西。它可以轻松地使用GraphQL API在JSON格式中返回PostgreSQL的数据。详细了解Hasura等将GraphQL和关系数据库结合的内容,请查看Hasura页面。

因为我是第一次使用GraphQL,所以不确定我能写得多准确,但是我感觉我掌握了教程的进展方法,所以我决定留下这次做过的记录,以供将来使用时参考。

引入和最初的询问

根据https://hasura.io/的推荐,尝试使用Heroku是一个好选择。你可以在外出时使用平板电脑等设备进行操作。参考Heroku的快速入门指南,在Heroku上进行部署。

如果部署成功,按照”Making your first GraphQL query”的指示进行操作,会返回一个JSON。

获取表连接的结果

作为一个更加现实的例子,当我想要接收JOIN操作的结果时,我有点困惑。在Schema中写着“GraphQL模式无需编写”,所以我误以为我不需要阅读后面的内容,结果陷入了困境。实际上,如果不继续阅读Basics,就无法编写实用的查询。

创建一个名为 “article” 的数据表和一个名为 “author” 的数据表,以便尝试使用 mutation 和 query。

本文将创建一个表。在数据选项卡中按照基础画面上的示例创建表格。

请确认数据库表的模式。返回到GraphQL选项卡,点击”< Docs”打开Documentation Explorer,然后点击query_root,在Basics页面上可以看到与Query页面上相同的内容。同时,点击”< Schema”返回页面,点击mutation_root,在Basics页面上可以确认已注册了与insert/upsert mutation、update mutation和delete mutation相同的内容。然而,字段的顺序却不同。我不知道如何确认对象类型。

请同样创建一个作者表(author table)。将id设为整数类型(自动递增),将name设为文本类型,我认为最好将id设为主键。

通过这个,Basics页面底部的query和mutation能够运行。

建立关系

按照《表格/视图之间的关系 使用外键》的要求,添加外键约束并设置关系。由于尚未执行插入操作,因此此时查询结果为空。

為了獲得與文書相同的查詢結果,請執行以下變動操作並將行插入表格中。

mutation add_author {
  insert_author(
    objects: [
      {id: 1, name: "Justin"},
      {id: 2, name: "Beltran"},
      {id: 3, name: "Sidney"},
      {id: 4, name: "Anjela"}
    ]
  ) {
    affected_rows
  }
}

mutation add_article {
  insert_article(
    objects: [
      {id: 1, title: "sit amet", content: "", rating: 5, author_id: 4},
      {id: 2, title: "a nibh", content: "", rating: 1, author_id: 2},
      {id: 3, title: "amet justo morbi", content: "", rating: 5, author_id: 4},
      {id: 6, title: "sapien ut", content: "", rating: 2, author_id: 3},
      {id: 9, title: "sit amet", content: "", rating: 5, author_id: 2},
      {id: 11, title: "turpis eget", content: "", rating: 3, author_id: 3},
      {id: 14, title: "congue etiam justo", content: "", rating: 3, author_id: 3},
      {id: 15, title: "vel dapibus at", content: "", rating: 1, author_id: 1},
      {id: 16, title: "sem duis aliquam", content: "", rating: 4, author_id: 1}
    ]
  ) {
    affected_rows
  }
}

执行文档中所述的查询后,您可能会得到类似的结果。排序方式可能会不同,如往常一样。

接下来,我们将创建一个名为”author_avg_rating”的视图。选择左下角的Data标签中的SQL选项,并确保”Track table”选项被选中,然后执行以下查询。该视图将被创建并添加到Hasura中。

CREATE VIEW author_avg_rating (id, avg) AS
SELECT author_id, avg(rating)
FROM article
GROUP BY author_id;

接下来,按照“无外键的表/视图之间的关系”来进行操作。请根据描述文本的要求,在屏幕截图和描述文本不一致的地方进行输入。

为什么查询的示例在初始状态下似乎是空白的,但点击后会显示出来。执行示例后通常会得到类似的结果。

然后继续向前

根据视角定制架构,虽然我还没有开始做,但或许可以从同样的思路着手解决。接下来就交给你了……咕噗噗…!

使用哪个工具来筛选结果

离开教程,以下是一个使用“where”的例子。从GraphQL官方网页的例子中可以看出,查询通常使用以下格式,但在Hasura中无法实现。

query {
  author(id: 1) {
    name
  }
}

在GRAPHIQL的选项卡中点击”< Docs”,打开Documentation Explorer,再点击query_root,即可看到以下内容。

author(
limit: Int
offset: Int
order_by: [author_order_by!]
where: author_bool_exp
): [author!]!

点击“author_bool_exp”后,将依次显示语法规则,从而可以理解在“where”中编写的格式…应该是如此,但由于对GraphQL不熟悉,所以并不清楚。通过查看存在的示例,我终于明白了。以下是提取id为1的记录的名称的查询:

query {
  author (where: {id: {_eq: 1}}) {
    name
  }
}

感受到一点小小的不满。

使用外键来创建一个干净的表,Hasura会建议关系,所以可以轻松地创建GraphQL的API。虽然也听到了关于外键毫无用处的观点,但今天我能感受到它的价值。

我在做数据库的一方觉得GraphQL是一个方便的工具,但是我对于开发数据读取工具的人来说,GraphQL是否也很方便,我感到有些疑问。

我个人在使用PostgreSQL时经常会进行递归查询,但很遗憾在GraphQL中会出现循环的情况。我想可能需要创建视图之类的东西。

Hasura似乎是一家印度公司,据说它使用阿修罗(鬼)的Haskell编写。虽然GREE也投资了他们,但因为几乎没有日语推文,我很好奇它在哪个圈子受到关注。我自己也是Haskell程序员,但这是我第一次听说!

如果要正式使用,Hasura标签的Medium文章似乎是一个不错的参考。

广告
将在 10 秒后关闭
bannerAds