前提
FlywayはSQLで定義したスキーマに基づき、DBを作成してくれるDBマイグレーションツールです。
ツール | |
---|---|
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を追加します。
<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
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
今後
使って見てさらに内容を充実させていきます。