前提
- 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';