entのDBマイグレーションを試みる

entはDBアクセスイイ感じツールなわけなのだが、マイグレーションに関しても一部お助けしてくれる。

まっさらなDBへテーブルなど作成するのは当然のこと、すでにあるテーブルのスキーマをentで定義しているスキーマへ移行することもentで容易にできるのだ。
ドキュメント冒頭にある通りSchema.Create(ctx)を呼び出すとイイ感じでやってくれる。
https://entgo.io/ja/docs/migrate/#%E8%87%AA%E5%8B%95%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

Atlas

DBマイグレーションのドキュメントを読んでいるとでてくるのがAtlasだ。

前述したSchema.Create(ctx) のオプションでWithAtlasなるものがあるが、コメントをみると将来はAtlasがデフォルトで利用されることになりそうだ。

AtlasはDB Schemaを管理するためのツールだ。
DDLをTerraform Likeに記述できる..とあるが要はHCLだ。

HCLで記述したSchemaとmigration対象のDBのSchemaの差分を得てmigrationの計画できるわけだ。

Coolなmanagement UIがあったりなかなかの魅力を誇るツールだ。

entとAtlas

この二つがどう絡み合うか。というとentはent上のSchema定義からDBが取るべきSchemaをGoのソースコードで管理している。
公式のexampleから引っ張ってくると↓のような具合だ。

AtlasはHCLでDB Schemaを定義していき、DBへ差分を反映していくスタイルのようだが、entを使っているとDB SchemaをHCLで書く必要すらないとうわけだ。

https://entgo.io/ja/docs/migrate#atlas-diff-and-apply-hooks
にあるようにAtlasとのintegrationを有効にしておくとAtlas WayでmigrationのHookを実装できるようだ。
Hookを実装することでmigrationのロジックを自由度高めにカスタマイズできるようだが、うまく使いこなす想像ができていないのであまり言及しないでおく。

Versioned Migration

ドキュメント中ではSchema.Create(ctx)の呼び出し一発でentのSchemaとDBのSchemaを同期させてしまうMigrationはAuto-Migrationと呼称しているようだ。
一方でタイムスタンプやシーケンス番号付きのsqlファイルを作りある時点でのDB Schemaを再現できるように管理していく方法をVersioned Migrationと呼称している。
Flyway, sql-migrateなんか使ったことがあると想像できるアレだ。

やり方は下を参照されたし。

ドキュメント上では↓のように書いてあるが、どうやらAtlasの最新版では

The Atlas migration engine does not support applying the migration files onto a database yet

migrationファイルの適用が可能になったようだ。
しかし、現段階だとsql-migrateのようにファイル名でmigration up/downを分けている構成などにAtlasは未対応なようなのでご注意。
atlas migrate newがformatオプションで様々なツールのフォーマットに合わせたmigrationファイルの生成を実現しているようなので、もう少しの辛抱かもしれない。
ちなみに今だと気軽にatlas migrate applyを実行したらdownとupが同時に実行される。

なのでentのドキュメントにあるように、
client.Schema.Diff(ctx, schema.WithDir(dir))
を呼び出すスクリプトを実装しておき、entのSchemaに変更があれば実行する。
実行するとsqlのmigrationファイルが手に入るのでgit管理し、稼働しているDBへatlasを利用してmigrationを実行するといいのだろう。

ちなみに、gitでの共同作業時にmigrationファイルが「DDLとして実行シーケンスが壊れているのに、コード上はコンフリクトはしないので気づかん。」ことによって意味わからなくなることへのAtlasが提供するsolutionはイイ感じっぽいので取り入れると良さそうだ。

この記事が気に入ったらサポートをしてみませんか?