こんにちは。ナナオです。
今回は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が起動を再試行するような機構を実装する必要があります)