menu
書いてる野郎
orebike@gmail.com
データベースの形状を開発の進みに合わせてコントロールする設定。
Spring Boot ではこの DBマイグレーションのツールに Flyway というものを使うようだ。
src/main/resources/db/migration
という位置にファイルを設置するようだ。
この位置に
V20181101001__hogehoge.sql
のようなファイルを作ってそこに DDL を書き込むと Flyway が読み取って書き込んでくれる。 Flyway はアップのみでダウン方向はサポートしてない。
アプリを起動したら勝手に migration するらしい。迷惑でしかない。 どの開発者の DB も同じようなタイミングで同じような状態になりたいわけではない。
しかも Flyway はダウン方向には進めないのだから。
このようにすると起動時に migration されるみたいだ。
spring.flyway.enabled=true
なので抑制するにはその逆をすればよい
spring.flyway.enabled=false
自分は yaml で書いているので
spring: flyway: enabled: false
これがいくつかあってなかなかよくわからなかった。
まず実行手段はいくつかあるらしく
の3通りある。Spring Boot がやるやつが bootJar とかでトリガーされるやつ。 CLI は OS に直に flyway をインストールして Spring Boot とはまったく別ものに実行するやつ。
今回は Gradle のプラグインとして実行するやつを選んだ。
Gradle - First Steps - Flyway by Boxfuse • Database Migrations Made Easy.
build.gradle にこれを書き加える。
plugins { id "org.flywaydb.flyway" version "5.2.1" }
いろいろ書き方はあるようだが、このようにプラグインを指定するのが 2018-11 現在最新のようだ。
flyway は DB を見に行くので DB へのコネクターが必要になる、こいつを指定してやる。 MySQL を使うので MySQL を指定する。
buildscript { ext { springBootVersion = '2.1.0.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath "mysql:mysql-connector-java:8.0.13" } }
接続情報が必要になるのでその設定も build.gradle に書き込む
flyway{ url = 'jdbc:mysql://localhost:3306/hoge1' user = 'root' password = 'unko' }
後は手動で管理テーブルを作り
$ ./gradlew flaywayBaseline
マイグレーション実行である。
$ ./gradlew flaywayMigrate
つまりローカルの統合したテスト用のスキーマとユニットテストに使うスキーマは別々に制御したいという話。
それをやるにはこのように既存のタスクを継承して独自のタスクを作ればよいようだ
import org.flywaydb.gradle.task.* task flywayMigrate1(type: FlywayMigrateTask) { url = 'jdbc:mysql://localhost:3306/hoge1' user = 'root' password = 'unko' } task flywayMigrate2(type: FlywayMigrateTask) { url = 'jdbc:mysql://localhost:3306/hoge2' user = 'root' password = 'unko' }
このように書いて、↑で書いていたこの部分は削除する
flyway{ url = 'jdbc:mysql://localhost:3306/hoge1' user = 'root' password = 'unko' }
こうすると
$ ./gradlew flaywayMigrate1 $ ./gradlew flaywayMigrate2
で、環境ごとに制御して実行できるようになる。