あ、しんのきです

趣味とか技術系とか

hasura migrate create --from-server について

きっかけ

Twitter 上で @kei_fff さんが Hasura の enum について紹介されていたことがきっかけで、こんなやりとりをしていました。

Hasura には hasura migrate create "<migration-name>" --from-server というコマンドで現在のテーブルの状態からマイグレーションを生成する機能があります。

hasura.io

当然ながらここで生成されるのはマイグレーションファイルなのでテーブル内のレコードはダンプされません。

一方で、テーブルを enum として設定するためにはテーブル定義が特定の条件を満たした上で 1 つ以上のレコードが必要です。

hasura.io

この 2 つの機能の矛盾について気になったので調査してみました。

結果

enum として設定したテーブルを作成した状態で hasura migrate create "init" --from-server コマンドを実行してみましたが、マイグレーションファイルの中に enum のレコードは含まれませんでした。

その状態で データベースが空の状態から hasura/graphql-engine:v1.3.0.cli-migrations-v2 イメージを起動してみたところ起動にコケました。

enum を定義する場合は Hasura Console から INSERT 文をマイグレーションとして作成するか、マイグレーションファイルを手動で編集して INSERT 文も含める必要がありそうです。

Hasura v1.3.0 から seeds ディレクトリにシードデータを定義できるようになりましたが、 cli-migrations イメージを使ったローカル開発のことを考えると migrations と metadata の間に差し込むことは難しいので、 docker-compose up するだけで環境が立ち上がるという手軽さは失われてしまうのであまり相性はよくなさそうです。

ついでに

自社のサービスで使っている割と複雑なテーブル定義に対して --from-server を使ってみたのですが、上記の enum の問題の他にも 独自定義した CREATE FUNCTION が中で使用しているテーブルの CREATE TABLE より先に定義されてしまってコケるという問題がありました。

適度に --squash--from-server を使ってマイグレーションを整理できれば migrations と metadata 内のファイルを見るだけで把握できる一覧性の良さを獲得できるかなと期待したのですが、ちょっとひとクセありそうですね。