Flyway Gradle DB migration 設定

今回は、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;

Sample DB MySQL


SQL作成

初期実行させるためのSQLファイルを作成します。

SQLファイルは以下に配置します。
プロジェクトルート/src/main/resources/db/V1__init.sql

IntelliJ Gradle Flyway

命名規則

バージョン付きマイグレーション: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
}

Gradle Flyway Sample


Flyway Migrate実行

プロジェクトルートで以下のコマンドを実行します。

./gradlew flywayMigrate

Gradle Flyway Sample

Gradle設定でbaselineOnMigrate = falseになっている場合、
./gradlew flywayBaselineを実行する必要があります。

baselineOnMigrate = trueの場合、いきなりflywayMigrateを実行しても
flyway_schema_historyテーブルが生成されて初期化されます。


トラブルシュートメモ

検証用に試していた時に、以下のエラーに遭遇しました。

[エラー文]

No migrations found. Are your locations set up correctly?

[現象]

現象としては、flywayMigrateを実行するとSUCCESSFULのメッセージが出て、
一見正常終了している様に見えるのですが、
確認するとSQLファイルの内容がDBに反映されておらず、履歴テーブルも存在しません。

Gradle Flyway Sample

本来、flywaymigrateを実行する際に裏処理として、
プロジェクトルート/build/resources/main/db/migration/SQLファイル
というファイル配置がされます。

こちらが自動配置されないと正常にマイグレーションが実行されません。

Gradle Flyway troubleshoot

[対処方法]

以下のコマンドを実行したところ、正常に実行ファイルがコピー配置され正常処理される様になりました。

./gradlew flywayClean
./gradlew processResources --info flywayMigrate

確認

マイグレーションが正常終了した場合、確認を行います。

flyway_schema_historyというDBテーブルに履歴が残りますので確認します。

SELECT * FROM flyway_schema_history;

今回の場合sqlファイルを1点のみ用意していたので、その履歴が残っています。

Gradle Flyway Schema History

また、用意しておいたSQLが実行され、DBテーブルが作成されていることを確認します。

Gradle Flyway Schema History

 


補足情報

・公式ドキュメント

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へ反映させることを、
コマンドベースで出来ますので、より安全な運用を構築できると思います。

都内でエンジニアをやっています。 2017年に脱サラ(法人設立)しました。 仕事で調べたことや、気になったことをメモしています。
投稿を作成しました 179

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る