なんかDBとのやり取りはRESTを使うのが最新かと思いきや、GraphQLというものがモダンらしい。
RESTは細かく誰でも直感的にわかるようにエンドポイントを分けるようにする考え方だが、いろんなテーブルのデータを使いたいときに意外と不便。取ってきたデータを元にもう一回GETして、、、
一方で、GprahQLを使えばエンドポイントを一つにする代わりに、クエリをjsonのように扱えながらいろんなテーブルのデータを一発で取得することができる。
今回はそんなgraphQLとSQLを自動で変換してくれるHasuraというAPIサーバを使ってみました。
公式ドキュメント
https://hasura.io/docs/1.0/graphql/core/index.html
セットアップ
ゼロから始めるやり方は以下の二つ。
- Harura Cloud
- Docker
今回はDockerを使った例を示します。
1. 新しいディレクトリで以下のコマンドどちらかを実行してdocker-composeファイルを取得
wget https://raw.githubusercontent.com/hasura/graphql-engine/stable/install-manifests/docker-compose/docker-compose.yaml
# or
curl https://raw.githubusercontent.com/hasura/graphql-engine/stable/install-manifests/docker-compose/docker-compose.yaml -o docker-compose.yml
docker-composeの中身はこのようになっています。
version: '3.6'
services:
postgres:
image: postgres:12
restart: always
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: postgrespassword
graphql-engine:
image: hasura/graphql-engine:v1.3.1
ports:
- "8080:8080"
depends_on:
- "postgres"
restart: always
environment:
HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
## enable the console served by server
HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
## enable debugging mode. It is recommended to disable this in production
HASURA_GRAPHQL_DEV_MODE: "true"
HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
## uncomment next line to set an admin secret
# HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
volumes:
db_data:
2. 起動
特に変更する必要がなさそうならそのまま起動させます。
docker-compose up -d
3. Hasura コンソールを確認
うまく起動できていれば、http://localhost:8080/consoleで以下のような画面が表示されるはずです。
データを登録してクエリを投げる
1. テーブルの作成
早速、テーブルを作っていきます。
今回はgraphQLのすごさを実感するために、メインのテーブルとそのテーブルの子テーブルを作成します。(RESTならメインテーブルから取ってきたデータを元に新たにGETする必要があるが、graphQLは一発で取れるところがすごい)
- 上部にあるDATAタブをクリック
- Create Tableボタンをクリック
- カラムを入力しましょう
- 子テーブルも同様
2. テーブル間のリレーションの設定
- Dataタブをクリック
- 子テーブルを選択
- Modifyタブをクリック
- Foreign Keysで設定
- 親テーブルを選択
- Relationshipsタブをクリック
- Table RelationshipsのArray relationshipsに先ほど子テーブルで追加した設定が反映されているはずなので、Addボタンをクリック
- クエリの際に利用するparameter名を入力
3. クエリを投げる
最後にクエリを投げてデータを取得できるか確認してみましょう。
GRAPHIQLタブのページで実行。