Edited at

Spring Bootでflywayを使ってみた。

More than 1 year has passed since last update.


前提

FlywayはSQLで定義したスキーマに基づき、DBを作成してくれるDBマイグレーションツールです。

Flywayのサイトはこちら

ツール

Java
1.8

Spring Boot
1.5.4

Maven
3.5.0

MySQL
5.5

開発環境
STS

今回はDBとしてMySQLを使います。

src/main/resources以下にある、application.yml で、マイグレーションの対象となるDBを定義しましょう。こちらのDBに対して、テーブルやらカラムやらが追加されます。

spring:

datasource:
url: jdbc:mysql://127.0.0.1:3306/<DB名>
username: <User名>
password: <Password>
driverClassName: com.mysql.jdbc.Driver


マイグレーションツールってなんだっけ?

Flywayに限らず、マイグレーションツールをどういう時に使うかですが、こういうツールがないとどういうことが発生するかを考えてみます。

マイグレーションツールは簡単にいうと、現在のDBの状態に関する情報を「一箇所で管理し、再現する」ツールです。

現在のDBの状態というのは、現在のテーブル構成、カラム構成にいたるまでにどういう作成・変更等があったかの情報のことです。

アプリが参照するDBにどういうテーブルがあって、どういうカラムがあるのか、その最新の情報は本番サーバを見れば確かにわかります。

一方で、別の開発者が本番DBに新しいカラム、テーブルを追加した等のDB環境の変更に関する情報を、逐一把握し、それを自分の開発環境に手動で反映するとなると骨が折れます。

どこかで、情報伝達の失敗が起こると、開発者間でも違うDBの状況になり、ある人は、古いテーブル定義のまま開発し続けることになります。「よし、テストするか」という段階で、必要なカラムがあったことに気付いたりします。つまり、複数の開発者間でDBの情報が違う状態が起こり得ます。

そんな時に役立つのがDBマイグレーションツール。


  • DBの定義やその変更に関する情報を一箇所で管理する

  • その情報に基づき最新のDBの状態を自動で再現する

というようなことをやってくれます。


導入の方法

さて、追加の方法ですが、


  • Mavenのビルドファイルに設定追加

  • テーブルの定義ファイルを追加

で、出来ます。


Mavenのビルドファイルに設定追加

MavenのビルドファイルにFlywayを追加します。


pom.xml

<dependency>

<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>


テーブルの定義ファイルを追加

src/main/resources/db/migration/以下にsqlファイルを追加します。

sqlファイルの名前についてはルールがあり、

V<バージョン>__<任意の名前>.sql

とつけます。ファイル名のルールは以下のようになってます。


  • One or more numeric parts

  • Separated by a dot (.) or an underscore (_)

  • Underscores are replaced by dots at runtime

  • Leading zeroes are ignored in each part


src/main/resources/db/migration/V1__User.sql

CREATE TABLE `User` (

`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
)


実行

Flywayでマイグレーションする方法はSTSより、

[Run] -> [Run As] -> [Spring Boot App]

と、普段の開発時の実行と同じように Appを実行するだけです。とても簡単。

対象のDBに

User テーブルと schema_version テーブルが作成されます。


参考

http://web-dev.hatenablog.com/entry/spring-boot/intro/flyway

http://qiita.com/osuo/items/3aa375f1a1d6dd3d2459


今後

使って見てさらに内容を充実させていきます。