既存のシステムが利用しているDBに相乗りしてアプリケーションを作ることがあります。
ユニットテストのためにDBマイグレーションできるFlywayは使いたいが、相乗りする本番環境DBは管理していないので余計なことはしたくない。
今回の記事では、SpringBootを使いつつ検証環境DBにFlywayを適用するが、本番環境DBにはFlywayを適用しない方法を記載します。
環境
- Java
- 15
- SpringBoot
- 2.4.1
- Flyway
- 7.5.0
- PostgreSQL
- 13.1
設定
Springの設定ファイルに次の設定を加えてください。アプリケーション起動時にFlywayを読み込まなくなります。
spring.flyway.enabled: false
環境ごとに設定ファイルを読み替える方法に関しては、別記事で解説しているので、類似記事を参考ください。
ユースケース
- 本番環境DBは他組織が管理しているので、Flywayを適用してはいけない
- Flywayが無償でサポートしていないバージョンのDBを使用している
DBのバージョンが古いとFlywayが無償サポートしていない場合があります。
画像はOracleのサポートバージョンです。Flyway Teamsと書いてあるものは、有償サポートです。
年間3,000ドルと結構お高めです。もちろん、サポート以外にもいくつか追加機能はありますが、どの程度便利なのかは使ったことが無いので私は分かりません。
サポートしていないので「動かないかもしれない」ではなく、意図的に動かないようコーディングされています。次のコードはFlywayのサポートがされていない時に発生するエラーのコードです。
package org.flywaydb.core.internal.exception; public class FlywayDbUpgradeRequiredException extends FlywayException { public FlywayDbUpgradeRequiredException(DatabaseType databaseType, String version, String minimumVersion) { super(databaseType.getName() + " upgrade required: " + databaseType.getName() + " " + version + " is outdated and no longer supported by Flyway. Flyway currently supports " + databaseType.getName() + " " + minimumVersion + " and newer."); } }
余談ですが、最新版のOracleのDockerイメージが非常に重く、起動に20分ほどかかってしまいます。ですので、サイズが軽くて5分くらいで起動する11gのイメージを使っているのですが、ダウングレードしたことでFlywayのバージョン問題に引っかかってしまいました。残念。
ソースコード
対象のYAMLファイル。 github.com
動作確認は次のコマンドで実行していました。このprofiles指定はデフォルトではできないので、類似記事を参考にしてください。
gradlew.bat bootRun -Pprofiles=local,disabled-flyway
終わりに
クラスメソッド様が既に似たような記事を出していたので助かりました。
一応Flyway公式の設定を読んでいましたが、ピンポイントでは分からないですからね…。
この記事も未来に誰かが読んで、有効活用してくれたらうれしいです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
類似記事
gradleでのbootRun時にプロファイルを指定できるようにする nainaistar.hatenablog.com
Spring Profilesで環境ごとの設定ファイルを読み込む(SpringBoot2.4の変更も記載) nainaistar.hatenablog.com
参考
敬称略。
Developers.IO:Flywayによる起動時のMigrationを制御する dev.classmethod.jp
Flyway公式:料金体系 flywaydb.org