以前、PostgreSQL+Node.jsでDBマイグレーションをするならnode-pg-migrateが良いぞ!という記事を書きましたが、結局DBマイグレーション・ツールを自作してしまいました。
IT業界には「車輪の再発明は良くない」という言葉がありますが、いろいろ考えた結果GraphQLバックエンド・プロジェクト用にDBマイグレーション・ツールってしまいました。
Ruby on RailsでDBマイグレーションツールを知る
私が初めてDBマイグレーションツールにふれたのは、Ruby on Rails(バージョン1.2)を使ったときでした。それ以前もJavaやPerlを使ってWebアプリを作っていましたが、データーベースの定義はExcel等で管理されていて、デプロイの際には手動でSQL文を実行しデーターベースをメンテナンスしていました。たまにデーターベースのメンテナンス作業を忘れソフトだけアップデートしリリース後にエラーを起こしたりする失敗を経験したこともあります。😅
当時、Ruby on Railsの便利さには驚き連続でしたが、DBマイグレーション機能も地味ですがとても良いものだと感じました。またデプロイの自動化ツールCapistranoと組み合わせて使うとデーターベースのメンテナンスも自動化されるのも感動しました。
DBマイグレーションツールの機能
Ruby on RailsのDBマイグレーション機能には以下があります、
- DB(SQL)に依存しないテーブル作成・変更用DSL
- Ruby on Railsは特定のDBに依存しないツールなので、テーブル作成・変更はSQL文ではなく、Rubyの関数(DSL)で記述できるようになっています
- マイグレーションの実行(up)と取り消し(down)
- Ruby on Railsでマイグレーションの取り消しコマンド(
rake db:rollback
)で、以前のテーブル定義に戻せます - Rails4.0以降は取り消し(down)用コードは自動生成されるようになりました
- Ruby on Railsでマイグレーションの取り消しコマンド(
- どのマイグレーション・ファイルを実行したのかを記憶し、不要なマイグレーション・ファイルを実行しない
- 無駄なマイグレーションを実行しないだけではなく、デプロイの際にサーバー上のマイグレーションが簡単に実行できるのもこのおかげです
- どこまでマイグレーションを実行したのかはDBに保存されています
- マイグレーション・ファイルの生成
- Railsでは各種ジェネレーターでマイグレーションファイルが(半)自動生成されます
- 重複しないユニークなマイグレーション・ファイル名のファイルを生成してくれます
今回作ったマイグレーション・ツール
PostgreSQL+Node.jsでDBマイグレーションをするならnode-pg-migrateが良いぞ!で書いたnode-pg-migrateもRailsもマイグレーション・ツールに近い機能を持っています。
ただしApollo GraphQLに入門してみた(3)に書いたようにPostgreSQL接続ライブラリーをpg-promiseに変更しましたが、node-pg-migrateはpg(node-postgres)を使っていました、これがマイグレーション・ツールを作るモチベーションの1つになりました。
また、今回のバックエンド・プロジェクトでは、
- SQLを使う事が決まっていたので 1.は必要ありません
- 2.のマイグレーション取り消し機能は10年以上Railsを使っていますが取り消しを使った事は2〜3回しか使った事がありませんので実装しませんでした
- 4.も重複しないユニークなマイグレーション・ファイル名を生成するだけにしました
なぜマイグレーション機能が必要なのかは、3.のどのマイグレーション・ファイルを実行したのかを記憶してくれる事です。
デプロイの自動化でき作業ミス等が起きない事は必須の機能だと思います。
ということでシンプルなツールになりました、GitHubに公開しました。