玩弄Hasura GraphQL Engine

Hasura是什么?

Hasura是一個工具,可以自動從PostgreSQL等數據源創建GraphQL服務器。
只需設置目標數據源的地址和密碼,就可以立即使用它作為GraphQL服務器。
它可以作為SaaS使用,但Hasura GraphQL Engine的核心功能是開源的,可以在Docker上構建。
本次我們將使用Docker以自建方式構建。

建立环境

通过从这里获取docker-compose.yaml文件,在yaml文件所在的目录中启动容器。

docker-compose up -d

你可以通过http://localhost:8080访问Hasura控制台。同时,也会在同一个容器中启动PostgreSQL。

数据库连接

image.png

创建表

image.png

创建一个包含UUID类型的id和Text类型的name字段的employees表。

插入和获取数据

image.png

由于Hasura GraphQL Engine能够根据表的信息自动创建与GraphQL更新相关的mutation,因此我们直接使用insert_employees即可。

mutation {
  insert_employees(objects: {name: "Yosuke Sakaue"}) {
    affected_rows
  }
}

参考查询的格式如下所述

query {
  employees {
    id
    name
  }
}

结果

{
  "data": {
    "employees": [
      {
        "id": "24c1de75-9578-497a-9fb2-011dc920572c",
        "name": "Yosuke Sakaue"
      }
    ]
  }
}

表之间的关系

image.png
image.png
image.png
image.png

插入和检索数据②

在「API」选项卡中插入数据。

将组织信息插入到部门表中。

mutation {
  insert_departments(objects: {name: "software development"}) {
    affected_rows
    returning {
      id
    }
  }
}

成果

{
  "data": {
    "insert_departments": {
      "affected_rows": 1,
      "returning": [
        {
          "id": "20b0042c-bc31-4657-8178-d4e7e097b668"
        }
      ]
    }
  }
}

将已返回的id更新到员工的员工信息中。

mutation {
  update_employees(where:
    {id:{_eq: "24c1de75-9578-497a-9fb2-011dc920572c"}},
    _set: {departments_id: "20b0042c-bc31-4657-8178-d4e7e097b668"}){
    affected_rows
  }
}

让我们尝试一下GraphQL的优势之一,批量获取数据。

query MyQuery {
  employees {
    id
    name
    department {
      id
      name
    }
  }
}

结果
通过一次请求,我们能够一次性获取员工信息以及其所属组织的信息。

{
  "data": {
    "employees": [
      {
        "id": "24c1de75-9578-497a-9fb2-011dc920572c",
        "name": "Yosuke Sakaue",
        "department": {
          "id": "20b0042c-bc31-4657-8178-d4e7e097b668",
          "name": "software development"
        }
      }
    ]
  }
}

总结

这次我们是通过创建新表来实现,但是能够通过连接现有的RDB来创建API服务器非常方便,也让我感受到了其潜力。
如果只是构建简单的CRUD服务,这已经足够了。此外,Hasura还具备其他功能,如Actions、Remote Schemas、Event Triggers、认证和授权、自动生成分页等,我也想在文章中介绍它们。

bannerAds