はじめに
JavaやSpring Bootを学習していた時、以下コマンドを見かけました。
./gradlew flywayMigrate
私は初めて見たとき、
「何をしているコマンドなんだろう?」
と思いました。
今回は、Flywayを初めて知った頃の自分に向けて、
- Flywayとは何か
- なぜ必要なのか
- flywayMigrateは何をしているのか
を初心者向けに整理してみます。
Flywayとは?
Flyway(フライウェイ)は、
データベースのバージョン管理ツール
です。
アプリケーションのソースコードをGitで管理するように、
データベースの設計変更も履歴として管理できます。
例えば、
V1__create_user_table.sql
ではユーザーテーブル作成。
V2__add_email_column.sql
ではメールアドレス列追加。
というように管理します。
なぜFlywayが必要なの?
例えば3人で開発しているとします。
AさんはUSERテーブルを作成。
BさんはALTER TABLEでカラムを追加。
この時、開発環境によってテーブル構造が違ってしまうことがあります!
そこでFlywayを使うと、全員が同じSQLを同じ順番で実行できます。
Flywayのイメージ
例えば次のSQLファイルがあるとします。
V1__create_user_table.sql
V2__add_email_column.sql
V3__create_order_table.sql
Flywayは、
まだ実行されていないファイルを順番に探し、
データベースへ適用します。
つまり、
V1
↓
V2
↓
V3
の順番で設計図を反映してくれるのです。
flywayMigrateとは?
実際によく見るコマンドについて。
./gradlew flywayMigrate
これは、
未実行のマイグレーションファイルをデータベースへ適用する
コマンドで、
「データベースを最新状態に更新してください」
という命令です。
実際の流れ
例えば、
データベースには
V1
まで適用済みだったとします。
新たに
V2
V3
が追加されました。
この状態で
./gradlew flywayMigrate
を実行すると、
V2
↓
V3
が順番に適用されます。
outOfOrderとは?
時々次のようなコマンドも見かけます。
./gradlew flywayMigrate -Pflyway.outOfOrder=true
通常Flywayは、
V1
V2
V3
の順番を守ります。
しかし後から
V1.5
のようなファイルを追加した場合、
通常はエラーになります。
そこで
outOfOrder=true
を指定すると、
番号順でなくても実行して良い
という動作になります。
Gitとの共通点
私はFlywayを理解するとき、
Gitに例えると分かりやすいと感じました。
Gitが
ソースコードの変更履歴
を管理するように、
Flywayは
データベースの変更履歴
を管理しています。
まとめ
今回学んだことを整理すると、
- Flywayはデータベースのバージョン管理ツール
- SQLファイルを履歴として管理できる
- flywayMigrateは未実行のSQLを適用するコマンド
- outOfOrder=trueは順番が前後しても実行するためのオプション
最初は「よく分からないコマンド」でしたが、
Flywayは
データベース版のGitのようなもの
と考えると理解しやすいと思います。
参考
