こんにちは。ナナオです。

今回はPostgresサーバーから、そのままGraphQLとして運用することが可能なHasuraをイジってみたいと思います。

準備

とりあえずディレクトリを作っておきます。

mkdir hasura_playground

ちゃっと検証したいので、とりあえずスキーマは以前触ったsqldefを使います。

【以前の記事はこちら】

マイグレーションの基盤とするSQLファイルを作成します。

touch schema.sql

テーブルはUserとそれに紐づくPostテーブルを作る感じにしましょう。

CREATE EXTENSION "uuid-ossp";

CREATE TABLE public.user (
    id uuid NOT NULL DEFAULT uuid_generate_v4(),
    name varchar(255),
    age integer
);

CREATE TABLE public.post (
    id uuid NOT NULL DEFAULT uuid_generate_v4(),
    title varchar(255),
    content text,
    user_id uuid
);

dockerでPostgresを起動するためのdocker-compose.yamlファイルも実装しておきます。

version: '3'

services:
  db:
    image: postgres:15
    container_name: postgres
    ports:
        - 5432:5432
    environment:
        - POSTGRES_PASSWORD=example

これを起動します。

docker compose up -d

あとは以下のコマンドで先程のテーブル定義を適用すればよいです。

psqldef --password=example -h localhost -p 5432 -U postgres postgres < schema.sql

あとは適当にデータを追加しておきましょう。

INSERT INTO "user" (name, age) VALUES ('test_1', 20), ('test_2', 30);

INSERT INTO "post" (title, content, user_id) VALUES ('blog_1', 'test', [test_1のID]), ('blog_2', 'test', [test_1のID]), ('blog_3', 'test', [test_2のID]);

hasuraの起動

ではhasuraを起動していきます。

先程実装したdocker-compose.yamlに実装を追加します。

version: '3'

services:
  db:
    image: postgres:15
    ports:
        - 5432:5432
    environment:
        - POSTGRES_PASSWORD=example

  # ここを追加
  hasura:
    image: hasura/graphql-engine:latest
    ports:
        - 8080:8080
    depends_on:
        - db
    environment:
        HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:example@db:5432/postgres
        HASURA_GRAPHQL_ENABLE_CONSOLE: "true"

これで再度コンテナを起動します。

docker compose up -d

起動したらlocalhost:8080にアクセスしてみましょう。

こんな感じでコンソールが表示されます。

ここのDataタブから「Track all」をクリックします。

こうすると、Postgresにあるテーブルを自動でトラッキングしてGraphQLを叩けるようになります。

Webコンソール上からクエリを叩くとこんな感じでレスポンスが返ってきます。

ちゃんと機能してますね!すごい!!!

使ってみた感想

とりあえずWebコンソールから使ってみたくらいですが、とてつもなく簡単にGraphQLサーバーができました。。

複雑なDBやマイグレーションに対してどのように対応していくかという部分はもう少し調べる必要があると感じましたが、ドキュメントもかなり豊富ですし軽いサービスならこれでバックエンド実装しちゃってもいいかもしれないなと思いました。

(あと同じdocker-composeファイル内にhasuraのサービスも書いちゃいましたが、これだとpostgresが起動していないとhasuraの起動に失敗するので、ファイルとして分けるかpostgresが起動するまでhasuraが起動を再試行するような機構を実装する必要があります)

また今回の実装に使用したリポジトリはこちらです。

参考

Hasuraがめちゃくちゃ便利だよという話 #GraphQL - Qiita

GraphQLのクエリを基礎から整理してみた #GraphQL - Qiita