今回は、FlywayというDBマイグレーションツールの導入設定メモです。
動作・接続可能なDBがインストール済みの前提の内容となります。
目次
バージョン
- MacOS:Sonoma 14.6
- Flyway:9.22.3
- MySQL:8.0.35-debian(Docker Container)
- IntelliJ IDEA:2025.1.1.1
DB作成
事前にデータベースを作成しておきます。
CREATE DATABASE aaa_db;
SQL作成
初期実行させるためのSQLファイルを作成します。
SQLファイルは以下に配置します。
プロジェクトルート/src/main/resources/db/V1__init.sql
命名規則
バージョン付きマイグレーション:V<バージョン>__<説明>.sql
例: V1__init.sql, V2_1__add_user_table.sql
リピートマイグレーション:R__<説明>.sql
例: R__refresh_views.sql
Flyway Gradle設定
build.gradleファイルに設定を行います。
buildscript
buildscriptというGradleビルド時にのみ適応される依存設定に追加します。
※具体的なバージョン数を確認できませんでしたが、
直近のバージョンの場合、buildscriptでの指定も必要となりました。
buildscript {
dependencies {
classpath("org.flywaydb:flyway-mysql:9.22.3")
}
}
plugins
plugins {
id 'org.flywaydb.flyway' version '9.22.3'
}
dependencies
dependencies {
implementation 'org.flywaydb:flyway-core:9.22.3'
implementation 'org.flywaydb:flyway-mysql:9.22.3'
}
DB接続設定
flyway {
url = 'jdbc:mysql://localhost:3397/refurbished_db'
user = 'root'
password = 'your_password'
locations = ['classpath:db/migration']
cleanDisabled = false
baselineOnMigrate = true
}
Flyway Migrate実行
プロジェクトルートで以下のコマンドを実行します。
./gradlew flywayMigrate
Gradle設定でbaselineOnMigrate = false
になっている場合、
./gradlew flywayBaselineを実行する必要があります。
baselineOnMigrate = true
の場合、いきなりflywayMigrate
を実行しても
flyway_schema_historyテーブルが生成されて初期化されます。
トラブルシュートメモ
検証用に試していた時に、以下のエラーに遭遇しました。
[エラー文]
No migrations found. Are your locations set up correctly?
[現象]
現象としては、flywayMigrate
を実行するとSUCCESSFULのメッセージが出て、
一見正常終了している様に見えるのですが、
確認するとSQLファイルの内容がDBに反映されておらず、履歴テーブルも存在しません。
本来、flywaymigrateを実行する際に裏処理として、
プロジェクトルート/build/resources/main/db/migration/SQLファイル
というファイル配置がされます。
こちらが自動配置されないと正常にマイグレーションが実行されません。
[対処方法]
以下のコマンドを実行したところ、正常に実行ファイルがコピー配置され正常処理される様になりました。
./gradlew flywayClean
./gradlew processResources --info flywayMigrate
確認
マイグレーションが正常終了した場合、確認を行います。
flyway_schema_history
というDBテーブルに履歴が残りますので確認します。
SELECT * FROM flyway_schema_history;
今回の場合sqlファイルを1点のみ用意していたので、その履歴が残っています。
また、用意しておいたSQLが実行され、DBテーブルが作成されていることを確認します。
補足情報
・公式ドキュメント
https://documentation.red-gate.com/flyway
・各種DB対応バージョンについて
https://documentation.red-gate.com/fd/database-driver-reference-277578849.html
・Community版とEnterprise版の違いについて
https://www.red-gate.com/products/flyway/editions
今回のメモは以上となります。
FlywayはCommunity版でも、DB最新化・リペアなどコマンドベースで自動適応することができます。
今回は触れませんでしたが、Local・Staging・Prodなど環境ごとに反映させたり、
一度Local・StagingでDB変更して問題ないことを確認してからProdへ反映させることを、
コマンドベースで出来ますので、より安全な運用を構築できると思います。