Spring Boot に DBマイグレーションツール Flyway を組み込んでみた
そろそろ当社でもDBマイグレーションツールを導入しようかなと思い立ち、Flywayを試してみました。
Flywayを導入すると、DDLの適用漏れにより環境によってテーブルやカラム構成が異なってしまうということを防ぐことができます。
今回はSpring Bootを使用したアプリケーションにFlywayを組み込んでみたいと思います。
Spring Boot 1.5.9では、Flywayのバージョンは3.2.1で定義されています。
せっかくですので、最新のFlaywayを使用してみたいと思います。
また、今回はSpring Bootが用意しているFlywayAutoConfigurationに設定をまかせてみます。その場合、spring-jdbcも必要となります。
Flyway用に別途データベースへの接続情報の設定は必要ありません。
多くのアプリケーションでBean定義済みと思いますが、既存のDataSourceが自動的に使用されます。
pom.xml
5.0.4
org.flywaydb
flyway-core
org.springframework
spring-jdbc
マイグレーション用のSQLファイルを用意してやります。
リソースディレクトリ内に db/migration ディレクトリを作成し、SQLファイルを格納します。
ファイル名は以下のルールがあります。
V{バージョン}__{説明}.sql
今回はありがちな商品テーブルを追加しつつ、レコードを追加してみます。
src/main/resources/db/migration/V1__create_products_table.sql
CREATE TABLE `products` (
`id` INT NOT NULL,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
src/main/resources/db/migration/V2__insert_products.sql
INSERT INTO `products` (`id`, `name`) VALUES
(1, '商品A'),
(2, '商品B'),
(3, '商品C');
準備は完了です。それではSpring Bootを立ち上げてみます。
アプリケーションを実行すると、以下のようなログが出力されます。
o.f.core.internal.util.VersionPrinter : Flyway Community Edition 5.0.4 by Boxfuse
o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://127.0.0.1:3306/test (MySQL 5.6)
o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.015s)
o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table: `test`.`flyway_schema_history`
o.f.core.internal.command.DbMigrate : Current version of schema `test`: << Empty Schema >>
o.f.core.internal.command.DbMigrate : Migrating schema `test` to version 1 - create products table
o.f.core.internal.command.DbMigrate : Migrating schema `test` to version 2 - insert products
o.f.core.internal.command.DbMigrate : Successfully applied 2 migrations to schema `test` (execution time 00:00.131s)
Flywayを初めて実行すると、FlywayがDBをバージョン管理するために flyway_schema_history テーブルが作成されます。
installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success
1 | 1 | create products table | SQL | V1__create_products_table.sql | 1761577794 | user | 2018-01-08 09:16:09 | 18 | 1
2 | 2 | insert products | SQL | V2__insert_products.sql | -712761052 | user | 2018-01-08 09:16:09 | 5 | 1
作成したSQLファイルのバージョンの順番でマイグレーションが実行されているのがわかるかと思います。
Spring Bootに組み込む以外にもコマンドライン、またはmavenを使用したマイグレーションが可能です。皆さまもDBマイグレーションを導入してみてはいかがでしょうか。