はじめに
APIサーバを作成するにあたって、「ent.
がモダンで使いやすそうだな」と思い学習した内容を書いていきます。
Quick Introductionから、極力コードを省いた、ent.
の使用フローについて、Atlas
によるマイグレーションついてわからなかったことを書きました。
使い方の流れ
- Goモジュールの作成
- スキーマの作成・定義
- アセットの生成
- スキーマのマイグレーション
Goモジュールの作成
go mod init example
スキーマの作成・定義
以下のコマンドで、Userスキーマを自動生成できる。
複数生成する場合も、引数を追加することで可能。
go run -mod=mod entgo.io/ent/cmd/ent new User
entdemo/ent/schema/
配下に user.go
ファイルが作成される。
内部のUser.Fields
および、User.Edges
メソッドの戻り値を変更することで、スキーマの定義をする。
アセットの生成
スキーマの追加・変更を行った際は、以下のコマンドでスキーマ用のアセットを生成する。
go generate ./ent
生成されるアセット
- グラフとのやり取りに使用される、
Client
オブジェクトとTx
オブジェクト - 各スキーマのCRUDビルダー
- ビルダーとの対話に使用される定数と述語を含むパッケージ。
- SQL用の
migrate
パッケージ - 変異型ミドルウェアを追加するための
hook
パッケージ
スキーマのマイグレーション
上記で設定したスキーマを、データベースにマイグレーションする。
マイグレーションには、2つの種類がある。
- オートマティックマイグレーション
- バージョン管理マイグレーション
オートマティックマイグレーション
以下のコードで、データベーススキーマを、生成されたスキーマオブジェクトと一致させることができる。ただし、どのような変更が適用されるかが事前にわからないため、本番環境での使用は推奨されない。
if err := client.Schema.Create(ctx); err != nil {
log.Fatalf("failed creating schema resources: %v", err)
}
バージョン管理マイグレーション
いくつかの方法があるが、公式で説明されているAtlasを使用した方法は次の通り。
- Atlasのインストール
- マイグレーションファイルの生成
- マイグレーションの適用
Atlasのインストール
OSによって異なるため、公式サイトを参考にインストール。
マイグレーションファイルの生成
atlas migrate diff migration_name --dir "file://ent/migrate/migrations" --to "ent://ent/schema" --dev-url "docker://mysql/8/ent"
atlas migrate diff
によって、マイグレーションディレクトリと任意の状態(ORM, SQLスキーマなど)との差分を計算し、新しいマイグレーションファイルを作成する。
-
--dir
URL形式でマイグレーションディレクトリを指定 -
--to
URL形式で希望の状態を選択 -
--dev-url
差分を計算するために使用される開発データベースへのURLAtlasが、ユーザーのスキーマやマイグレーションなどを処理し、検証するために使う。
一回限りなため、通常はdockerを指定する。
マイグレーションの適用
atlas migrate apply --dir "file://ent/migrate/migrations" --url "mysql://root:pass@localhost:3306/example"
マイグレーションファイルの内容を--url
で指定したデータベースに適用できる。
また、マイグレーションファイルの生成をプログラムでする場合は、このリンクを参考にしてほしい。
感想
まだent.
の触り部分ですが、とても使いやすそうで、型安全なためさらに勉強して使っていきたいと思いました。
また、Atlasを利用したCI/CDについても勉強していきたいです。
関連ワード
- エンティティ
データベースにおいて、管理すべき情報のこと。 - スキーマ
データベースの構造を定義するための設計図 - フィールド
テーブル内のカラム(列)に相当する、データの型の値を格納する場所 - エッジ
GraphQLにおける、ノード(エンティティ)間の関係性を表すもの