1
0

ent. の使い方についてかんたんにまとめてみた

Posted at

はじめに

APIサーバを作成するにあたって、「ent.がモダンで使いやすそうだな」と思い学習した内容を書いていきます。

Quick Introductionから、極力コードを省いた、ent.の使用フローについて、Atlasによるマイグレーションついてわからなかったことを書きました。

使い方の流れ

  1. Goモジュールの作成
  2. スキーマの作成・定義
  3. アセットの生成
  4. スキーマのマイグレーション

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つの種類がある。

  1. オートマティックマイグレーション
  2. バージョン管理マイグレーション

オートマティックマイグレーション

以下のコードで、データベーススキーマを、生成されたスキーマオブジェクトと一致させることができる。ただし、どのような変更が適用されるかが事前にわからないため、本番環境での使用は推奨されない。

if err := client.Schema.Create(ctx); err != nil {
    log.Fatalf("failed creating schema resources: %v", err)
}

バージョン管理マイグレーション

いくつかの方法があるが、公式で説明されているAtlasを使用した方法は次の通り。

  1. Atlasのインストール
  2. マイグレーションファイルの生成
  3. マイグレーションの適用

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 差分を計算するために使用される開発データベースへのURL

    Atlasが、ユーザーのスキーマやマイグレーションなどを処理し、検証するために使う。

    一回限りなため、通常はdockerを指定する。

マイグレーションの適用

atlas migrate apply --dir "file://ent/migrate/migrations" --url "mysql://root:pass@localhost:3306/example"

マイグレーションファイルの内容を--urlで指定したデータベースに適用できる。

また、マイグレーションファイルの生成をプログラムでする場合は、このリンクを参考にしてほしい。

感想

まだent.の触り部分ですが、とても使いやすそうで、型安全なためさらに勉強して使っていきたいと思いました。
また、Atlasを利用したCI/CDについても勉強していきたいです。

関連ワード

  • エンティティ
    データベースにおいて、管理すべき情報のこと。
  • スキーマ
    データベースの構造を定義するための設計図
  • フィールド
    テーブル内のカラム(列)に相当する、データの型の値を格納する場所
  • エッジ
    GraphQLにおける、ノード(エンティティ)間の関係性を表すもの
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0