はじめに
FlywayとはJava用に開発されたDBマイグレーションツールです。
DBマイグレーションとは、簡単に言えば、DBのバージョン管理ですね。
DBマイグレーションツールを使わない場合、環境によってDB構成に差異が生じて、アプリケーションの動作にも影響してきます。flywayを使うことで、DB変更によるアプリケーション障害の影響は減らせると思います。
今までどうやっていたか
マイグレーションツールがなかった時代は、A5M2やERMasterなどのER図作成ツールを使い、DDL出力しDBを作成していました。構成に変更があったときは、ER図を更新し、更新用のDDLをExcelなどで管理していました。
以前、Playframeworkという、Java、Scalaのフレームワークを使っていた時があったのですが、
エンティティクラスを変更するだけで、フレームワークがDBとの差異を検知し、自動で更新してくれていました。
今回お話するJavaEEにはそのような機能はないので、Flywayを使うことになります。
flywayを調べると、SpringBootとの連携の記事が多く、JavaEE連携の記事が少ないように思いましたので、使い方を残すことにしました。
対象
- JavaEE7
- NetBeans8.2
- Flyway5.2.4
- PostgreSQL9.6
準備
MavenでWebアプリケーションプロジェクトを作成します。(Webでなくても問題ないです。)
pom.xmlを以下のように編集します。
・・・
<dependencies>
・・・
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1206-jdbc41</version>
</dependency>
</dependencies>
<plugins>
・・・
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.2.4</version>
<configuration>
<url>jdbc:postgresql://<ホスト名>:<ポート>/flywaydb</url>
<user><ユーザ名></user>
<password><パスワード></password>
</configuration>
</plugin>
</plugins>
src/main/resources/db/migrationに以下のファイルを作成します。
作成するファイルには命名規則があるので注意が必要です。
V__ + (バージョン番号) + (任意の名前) + .sql
__はアンダースコアが2つです。
create table users (
id int not null,
name varchar(100) not null
);
実行
$ cd <プロジェクトのルート>
$ mvn flyway:migrate
DB構成に変更があった場合は、命名規則に従ってsqlファイルを作成します。
NetBeanとの連携
アプリケーションの実行やデバッグを行う場合、IDEの機能を利用することが多いと思います。
現状、マイグレーションをコマンドで個別に実行する必要があるので、NetBeansと連携したみたいと思います。
プロジェクトを右クリック->[プロパティ]を開きます。
カテゴリの[アクション]を開きます。
使っている構成(通常はデフォルト構成)を選択します。
[プロジェクトのビルド]を選択し、[ゴールの実行]の設定値を以下のように変更します。
(変更前) install
(変更後) flyway:migrate install
設定が完了したら、[OK]ボタンでプロパティ画面を閉じます。
連携を確認
プロジェクトを右クリック->[ビルド]を実行します。
--- flyway-maven-plugin:5.2.4:migrate (default-cli) @ flyway-javaee ---
Flyway Community Edition 5.2.4 by Boxfuse
Database: jdbc:postgresql://localhost:25432/flywaydb (PostgreSQL 9.6)
Successfully validated 1 migration (execution time 00:00.066s)
Current version of schema "public": 1
Schema "public" is up to date. No migration necessary.
上記のログが出力されれば成功です。