小ネタ。なお、私のユースケースを満たせていなかったので、調査結果だけです。
環境
- Java
- 17
- org.flywaydb
- 8.5.13
- org.springframework.boot
- 2.7.7
対応
設定ファイルの変更
PostgresやOracle等々で実行するSQLを変更するために、spring.flyway.locations
にclasspath:db/migration/{vendor}
を設定します。
spring.flyway.locations: classpath:db/migration/{vendor}
ディレクトリを作成する
ディレクトリを用意します。{vender}
で置換できるのは、こちらのJavaファイルを確認してください。
今回は、h2
, postgresql
, mysql
を用意します。
- db - migration - h2 - マイグレーションSQL - postgresql - マイグレーションSQL - mysql - マイグレーションSQL
後は、起動時、テスト時にDatabaseDriver
名を元に特定のディレクトリのSQLが実行されていることが分かります。どのような動作確認をしていたかは、ソースコードで確認してください。
ソースコード
解決したかったユースケース
テスト時はH2
を使用し、アプリケーション起動時はPostgres
を使用しています。
ローカル環境構築時には、動作確認できるようにFlyway
でマスタデータだけでなく、トランザクションデータを登録しようとしていました。
ただ、設定ファイルを書き換えたりする手間を考えると、逆にわかりづらいです。理想としては、{vender}
の上位ディレクトリは汎用的なSQLを流しつつ、{vender}
ディレクトリにトランザクションデータを登録させようとしていました。
- db - migration - 汎用SQL - postgresql - トランザクションSQL
このように配備したところ、子孫ディレクトリのSQLまで実行するため、汎用SQLもトランザクションSQLも実行されてしまいました。さらにclasspath:db/migration/{vendor}
と設定すると、上位ディレクトリの汎用SQLが実行されなくなりました。
使えるユースケースもあると思いますが、かなり限定的だと思うので、私は使いません。以前、私が書いた記事の設定で十分です。
終わりに
この機能自体はFlyway
の公式には載っていません。Spring側のDatabaseDriver
で判別すると記載されているとおり、Springのラッパーライブラリ側で解決しています。
Flywayの公式ドキュメントを読んで存在せず、Spring側の公式ドキュメントを読んでようやく存在を認識しました。教えていただいたMitz Shiibaさん感謝です。
参考情報
- https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.data-initialization.migration-tool
- https://github.com/spring-projects/spring-boot/blob/v3.0.1/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java
twitter.comこれはどうですか?{vendor}https://t.co/eMW1W51poG
— Mitz Shiiba (@bufferings) 2022年12月16日