きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Flywayで特定のDBだけSQLを実行する(Spring, vender, Postgres)

小ネタ。なお、私のユースケースを満たせていなかったので、調査結果だけです。

環境

  • Java
    • 17
  • org.flywaydb
    • 8.5.13
  • org.springframework.boot
    • 2.7.7

対応

設定ファイルの変更

PostgresやOracle等々で実行するSQLを変更するために、spring.flyway.locationsclasspath: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さん感謝です。

参考情報

類似情報