Spring Boot/開発/DBマイグレーション

Spring Boot/開発/DBマイグレーション

データベースの形状を開発の進みに合わせてコントロールする設定。

Spring Boot ではこの DBマイグレーションのツールに Flyway というものを使うようだ。

準備

src/main/resources/db/migration という位置にファイルを設置するようだ。

この位置に

V20181101001__hogehoge.sql

のようなファイルを作ってそこに DDL を書き込むと Flyway が読み取って書き込んでくれる。 Flyway はアップのみでダウン方向はサポートしてない。

通常の実行

アプリを起動したら勝手に migration するらしい。迷惑でしかない。 どの開発者の DB も同じようなタイミングで同じような状態になりたいわけではない。

しかも Flyway はダウン方向には進めないのだから。

起動時の migration の抑制

このようにすると起動時に migration されるみたいだ。

spring.flyway.enabled=true

なので抑制するにはその逆をすればよい

spring.flyway.enabled=false

自分は yaml で書いているので

spring:
  flyway:
    enabled: false

migration の手動実行

これがいくつかあってなかなかよくわからなかった。

まず実行手段はいくつかあるらしく

  • Spring Boot にやらせる
  • Gradle の Plugin でやる
  • CLI版の Flyway から直接やる

の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

環境により Migration を制御したい

つまりローカルの統合したテスト用のスキーマとユニットテストに使うスキーマは別々に制御したいという話。

それをやるにはこのように既存のタスクを継承して独自のタスクを作ればよいようだ

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

で、環境ごとに制御して実行できるようになる。

java/spring/spring_boot/dev/db_migration.txt · 最終更新: 2018-11-08 09:43 by ore