Spring Boot で開発環境の組み込みDB(h2)とリリース用データベース(SQL Server)でFlywayを共存させる


前提

  • Spring Boot でデータベースを使うサーバアプリケーションを作る
  • hibernate を使っていて、データベースも初期化している。
    • spring.jpa.hibernate.ddl-auto=update
  • ローカルの開発環境は h2 を使った組み込み DB をオンメモリで起動
    • アプリを起動する度にデータベースを初期化する
  • リリース先ではもちろん永続化が必要なので別のデータベースに切り替える
    • 今回は SQL Server
  • データベースのスキーマ変更が必要になったので Flyway で構成管理したい

問題点

  • Flyway を適用して db/migration に SQL ファイルを置くが、2 種類のデータベースで競合する。
  • ローカルでの開発時は h2 を使うのでマイグレーションは不要
    • 毎回作り直しでオッケー
  • SQL Server を使う場合はマイグレーションして欲しい

解決方法

  • SQL ファイルを vendor 毎に分けて配置
  • h2 の場合はダミーの SQL ファイルを配置
  • Flyway の SQL が先に実行されるので hibernate の初期化は影響を受けない(テーブルが作成済みのため)
application.properties
spring.flyway.locations=classpath:db/migration/{vendor}
src/main/resources/
  db/
    migration/
      H2/
        V1_0_0__dummy.sql
      SQLSERVER/
        V1_0_0__Initial.sql
        V1_1_0__AddHoge.sql
V1_0_0__dummy.sql
select 'dummy';