Prisma虽然不错,但是Hasura GraphQL Engine也能以超高速实现GraphQL服务器

我想说的话 (Wǒ shuō dehuà)

    • GraphQLのAPIを自前で実装するのは面倒なんでこういうのに頼って楽したい

Prismaもいいと思うが、PostgreSQLならHasura GraphQL Engineも結構いい
Prismaと違ってHasura GraphQL Engineはクライアントから直接呼ばれることも可能だが、凝った実装しようとするとやはりClient専用のGraphQL Serverは必要

Hasura GraphQL Engine是什么意思?

Prisma可以构建与MySQL等其他关系数据库管理系统兼容的GraphQL服务器,而Hasura GraphQL引擎仅构建用于PostgreSQL的GraphQL服务器。

建立方法

這份結構文件非常完整,如果說實話,我覺得根本不需要寫這篇文章。對於英語敏感的人,希望你能參考我拙劣的日文文章嘗試一下。

请设置Hasura GraphQL Engine

在公式文档中有两种方式,一种是使用Heroku创建,另一种是使用Docker(-compose),显然使用Docker更方便,所以本篇文章将使用该方法进行说明。

$ mkdir hasura_sample
$ cd hasura_sample
$ wget https://raw.githubusercontent.com/hasura/graphql-engine-install-manifests/master/docker-compose/docker-compose.yaml

首先,使用wget命令获取更新示例的docker-compose.yml文件。文件内容没有特别复杂的内容。

version: '3.6'
services:
  postgres:
    image: postgres
    restart: always
    volumes:
    - db_data:/var/lib/postgresql/data
  graphql-engine:
    image: hasura/graphql-engine:v1.0.0-alpha13
    ports:
    - "8080:8080"
    depends_on:
    - "postgres"
    restart: always
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:@postgres:5432/postgres
    command:
      - graphql-engine
      - serve
      - --enable-console
volumes:
  db_data:

然而,在我的环境中,由于不支持3.6版本,所以我降级到了3.3版本。

只需要运行docker-compose up就行了。(虽然官方建议用-d参数以守护进程方式运行,但因为想要查看日志,所以我们选择了不使用守护进程模式运行。)

在PostgreSQL中创建表格。

您需要创建一个存储GraphQL获取的数据的PostgreSQL表格。当然,如果已经连接到现有的数据库,则不需要进行此操作。
如果之前已经启动了docker-compose,那么您应该能够通过http://localhost:8080/console访问Hasura GraphQL Engine的控制台。

image.png

首先,创建一个用于存储从GraphQL获取的数据的表格。
点击位于页面顶部的”DATA”选项卡,显示用于创建模式的页面。
(顺便说一下,这个页面是用React制作的。)

image.png

通过点击中央的”Create Table”按钮或左侧菜单的”Add Table”选项,可以打开架构定义页面。在那里,您可以输入所需信息来创建表。以本次为例,我们将创建一个名为”Community”的表,并准备好三个列,即”id”、”name”和”description”。(模拟Rails创建表的方式)

image.png

接下来,我们将以以下方式在创建的社区中创建子表事件表。

image.png

重要的是建立community_id与社区表和关系。

创建表的关系

定义一个可以在GraphQL中解析的关于创建的社区表和事件表之间的关系。首先,在事件表中创建外键。打开创建的事件表,在”修改”选项卡中进行以下设置。

image.png

由于外键的设置已完成,接下来将创建从社区表到活动表的关系。打开社区表,点击关系选项卡,应该会看到添加按钮,点击后会打开一个名称注册界面。这个名称是指从一个社区角度来看的活动数据,我们将其命名为”events”。简而言之,在后续使用GraphQL查询时,该名称将用于获取一个社区的相关活动数据的命名。

image.png

基本的なテーブル定義はほぼ終了しました。もちろん、もしイベントテーブルからコミュニティテーブルを参照するようなGraphQLクエリが必要な場合は、逆の関連付けも行う必要があります。

执行GraphQL

通过打开位于画面上部的GRAPHQL选项卡,可以执行GraphQL操作。

image.png

目前GraphQL服务器已经完成了。可以在编写数据筛选(where)和排序(order_by)的SQL时使用,我个人觉得非常易懂。

image.png

当然还可以进行like搜索。

一般情况下,CRUD的实现非常简单。

验证和授权

驗證

如果需要进行认证,则也可以通过webhook来实现。
https://docs.hasura.io/1.0/graphql/manual/auth/index.html

image.png

当然,您可以自行在接收webhook后进行身份验证,使用AWS Cognito也可以,使用Firebase也可以,只要能够实现即可。

承認

認可似乎能夠在某種程度上進行定義。

我想提供一个具体的设置示例。比如,假设我们已经确定了用webhook进行授权的用户ID,那么我们想要设想的是,只有该用户能够查看特定数据的情况下进行显示。

image.png
image.png

在当前的设置中,如果不在HTTP header中添加任何内容,则被授权获取所有数据,因此以下是可以获取到所有数据的方式。

image.png

然而,如果将之前的用户角色和数据中的用户ID设置在http头中,只能访问部分数据。

image.png

然而,如果尝试同时获取子表数据,将会出现错误。

image.png

由于事件数据的授权权限未设置,因此无法获取数据而导致错误。所以我们需要在事件表中添加授权设置。本次我们正在使用社群表的user_id来控制数据的引用,因此我们也将在事件表中进行相同的操作。因此,首先我们需要创建事件表和社群表之间的关系。

image.png

如果打开关系标签后点击添加按钮并输入名称,就完成了。
最后在权限标签下的活动表中,通过将user_id与社区表的数据进行筛选即可完成设置。

image.png

通过这样的做法,还可以成功地获取事件表的数据。

image.png

在实际使用中可能出现的其他要求

如果需要聚合函数,可以通过定义视图来实现。
https://docs.hasura.io/1.0/graphql/manual/queries/aggregations.html

如果还有其他在实际工作中可能需要的事项,请在此处增加。

最後景

由于只需要这些,因此可以很容易地构建GraphQL的API,因此后端构建变得非常简单。即使是专注于前端的工程师也可以在一定程度上进行构建。AWS AppSync也不错,但在将现有数据适配为GraphQL并使搜索功能更加强大时,应该要构建使用RDBMS的GraphQL。
然而,如我所写的,通常的CRUD可以轻松构建,但如果客户端需要进行聚合处理来保存聚合数据,则有些情况下可能希望在应用程序实现上避免这种情况。在这种情况下,需要考虑这一点。
在这种情况下或者是从多个微服务中获取数据并汇总返回给客户端的情况下,建议像Prisma一样设置一个外部公开的GraphQL服务器来处理,这可能更好。

广告
将在 10 秒后关闭
bannerAds