简介

[Hasura Architecture](https://res.cloudinary.com/practicaldev/image/fetch/s--RrJdPj9j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/i/z0i3f7aii1hxv7ua2exy.png)

图像源

Hasura是一个开源引擎,可连接到您的数据库和微服务并自动生成生产就绪的 GraphQL 后端。

Hasura 将您的 Postgres 模式映射到 GraphQL 并为您生成查询、突变和订阅。除此之外,它们还提供不同类型的查询过滤器,如whereorder_bylimitoffset等,以帮助您在前端构建复杂的功能,如过滤、排序、分页等。

部署

Hasura 提供了多种部署 Hasura 引擎的方法:

  • 至 6

  • 码头工人

  • Kubernetes

使用 Docker,您几乎可以将引擎部署在任何允许您使用 docker 的服务上。

使用 Heroku 部署

要使用 Heroku 部署 Hasura,请转到此文档。点击该Deploy to Heroku按钮,您将被重定向到 Heroku 以部署您的应用程序。

[创建 Hasura 应用程序](https://res.cloudinary.com/practicaldev/image/fetch/s--pQR2dmI5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/p1zzlyaijfukss922y44.png)

为您的应用程序命名并选择要部署到的区域,然后单击Deploy App按钮并等待 Heroku 部署您的应用程序。

部署后,您可以单击View App按钮,您将被带到 Hasura 控制台。 Hasura 控制台有 4 个选项卡,如果您使用的是最新的 beta 版本,那么您将有一个名为Actions的选项卡

  • GraphiQL: 此选项卡可让您访问 graphiql 游乐场以探索查询、突变和订阅。

  • 数据: 在此选项卡中,您可以管理 SQL 表并创建不同的模式来托管相关表。

  • Remote Schema: 这就是microservices的用武之地。使用远程模式,您可以将服务添加到您的应用程序。现在这些服务也必须用 GraphQL 编写。此功能类似于 Apollo 引入的 Schema Stiching 或Schema Federation,让您将后端划分为多个服务。

  • 事件: 当您想要执行基于事件触发器的自定义逻辑时,例如创建、更新或删除表中的行时,会出现事件。

  • 操作: 目前处于测试阶段,可以将操作添加到现有的 Hasura 架构中以扩展它以将业务逻辑添加到您的查询中,并执行数据验证甚至身份验证/授权等操作。

添加架构

对 SQL 表有一点了解可能会派上用场,但也有一种 GUI 方式来管理表,也可以用来代替在 SQL 编辑器中编写 SQL 代码。让我们从创建表开始。

创建表

Data选项卡中,单击Create Table按钮,您将进入表创建表单。我们将以费用管理应用程序为例进行演示。

[建表表格](https://res.cloudinary.com/practicaldev/image/fetch/s--S4D3Gztl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/qy3r7hxm8ybwdh3zuy5t.png)

让我们添加expenses作为我们的表名,我们将创建以下字段。

  • id:属于UUID类型,设置为unique,默认值设置为gen_random_uuid()

  • 标题:属于Text类型。

  • 类别:也属于Text类型。

  • 日期:类型timestamp without time zone

  • 数量:double precision

  • payment_method:类型为Text并设置为可为空。

您的表单现在应该如下所示。

[填表形式](https://res.cloudinary.com/practicaldev/image/fetch/s--wog1STuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/63irfbqx1eartltu6fzc.png)

现在点击表单底部的Add Table按钮来添加表格。现在,如果您转到GraphiQL选项卡,您将看到 Hasura 已为您生成查询,您可以开始探索。

[游乐场](https://res.cloudinary.com/practicaldev/image/fetch/s--8I2xyGxE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/i/apxl1jprt7zpbcc57j09.png)

Hasura 为您生成以下查询、突变和订阅。

  • 个查询

  • 花费

  • 费用_by_pk

  • 费用_聚合

  • 突变

  • 插入_费用

  • 删除_费用

  • 更新_费用

  • 订阅

  • 花费

  • 费用_by_pk

  • 费用_聚合

这里expenses_by_pk用于通过主键获取费用。查询的名称也是根据表名生成的,可以更改为:

数据 > 选择表 > 修改 > 自定义 GraphQL 根字段。

[自定义根字段](https://res.cloudinary.com/practicaldev/image/fetch/s--r_CcL_vX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/2uw180wy0ld7kevv1fe3.png)

修改后,只需保存更改,Hasura 将为您更新查询名称。

写查询

Hasura GraphQL 引擎从 Postgres 模式模型中自动生成查询作为 GraphQL 模式的一部分。它生成一系列可能的查询和运算符,这些查询和运算符也适用于 SQL 模式中定义的关系。

query MyQuery {
   expenses {
      id
      date
      title
      amount
      category
      payment_method
   }
}

进入全屏模式 退出全屏模式

您可以像使用 GraphQL 一样向查询中添加字段。 Hasura 为您提供额外的是不同类型的子句,让您的生活更轻松,并立即内置过滤、排序、搜索功能。

  • distinct_on:当您需要获取一个没有其他对象共享的具有唯一值的对象时使用。

  • limit:用于限制您在响应中获得的行/对象的数量。

  • offset:最好与限制一起使用以进行分页。

  • order_by:用于按顺序排列查询响应。多个字段可以与ascdesc序列一起使用。

  • where:当需要根据不同字段的比较来查找行/对象时使用。 Hasura 足够聪明,可以根据字段的类型显示适当的过滤器。

写入突变

对于每个表,您会得到三个突变:

  • 创建

  • 更新

  • 删除

每个突变都使您可以访问批处理操作。因此,要添加单行/对象,您可以使用以下突变。

mutation MyMutation {
   create_expenses(
      objects: {
         date: ""
         title: ""
         amount: ""
         category: ""
         payment_method: ""
      }
   ) {
      returning {
         id
         date
         title
         amount
         category
         payment_method
      }
   }
}

进入全屏模式 退出全屏模式

要一次添加多个行/对象,只需传递一组对象而不是一个对象。

mutation MyMutation {
   create_expenses(
      objects: [
         {
            amount: "487"
            title: "Groceries"
            payment_method: "Card"
            category: "Food & Drinks"
            date: "2017-11-17T18:30:00"
         }
         {
            amount: "5400"
            title: "Table"
            payment_method: "Card"
            category: "Furniture"
            date: "2017-11-16T18:30:00"
         }
      ]
   ) {
      returning {
         id
         date
         title
         amount
         category
         payment_method
      }
   }
}

进入全屏模式 退出全屏模式

写作订阅

订阅在编写方式上与查询相同,除了关键字query,使用subscription

subscription MyQuery {
   expenses {
      id
      date
      title
      amount
      category
      payment_method
   }
}

进入全屏模式 退出全屏模式

结论

我已经在工作中使用 Hasura 几个星期了。 Hasura 帮助我们构建了一个功能丰富的应用程序,几乎没有后端代码库。因此决定分享我在过去几周学到的东西。上周我还构建了一个费用应用程序,可以在我的Github上找到。

我将写更多关于将 Hasura 与我们的前端集成的文章,敬请期待。您可以在我的Twitter或我的Instagram上关注我,以随时了解最新进展。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐