読者です 読者をやめる 読者になる 読者になる

ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

データベースマイグレーション用にJava製ツール「flyway」を導入する

f:id:piro_suke:20160307015935j:plain

新しいチームでデータベースマイグレーションの仕組みが決まっていなかったので、flywayを導入してみた。

結論としては手軽で十分使えそう。

データベースマイグレーションとは

本来のマイグレーションの意味とは異なるかもしれないが、

データベースマイグレーションが実際に意味するのは、

「プログラムのバージョンとデータベース構成のバージョンを合わせること」

だと捉えている。

例えば、

あるプロジェクトで仕様変更が発生して「商品マスタに分類6カラムを追加する」ということが必要な場合、 プログラム側が対応済みでもDBの商品マスタに分類6カラムが追加されていなければプログラムは動かない。 プログラムの変更と同時にデータベース構成が変更されるようにすることではじめて動作するようになる。

自分一人で開発している場合はローカルのデータベース構成を変更して、 初期設定用SQLにカラムを追加しておくだけで良いかもしれないが、 複数人で1つのシステムを開発していると他の誰かが知らないうちにカラムを追加して その情報を共有せずにその追加カラムを使用するプログラムだけをリポジトリに コミットしたりしていると、他のメンバーの環境では実行時にエラーが発生するようになり、 原因調査で時間を取られることになる。

こういったデータベース構成のバージョンが変わったことを共有する方法としては メールで送るとか資料で共有するとか色々あるが、 各開発者が意識しなくてもリポジトリの更新取得時やビルド時に自動で反映されるのが一番効率が良い。

そういった仕組みを実現するためのツールとして「データベースマイグレーションツール」があり、「Flyway」もその一種。

Flywayについて

Flyway by Boxfuse • Database Migrations Made Easy.

Java製のデータベースマイグレーションツールで、下記の特徴を持つ

  • コマンドライン、Javaクラス、mvnプラグインとして実行可能
  • 指定したフォルダにバージョン番号付きSQLファイルを配置してマイグレーションを実行すると未実行のバージョンのSQLのみ実行してくれる。
  • データベースにマイグレーション状況管理用テーブルを作成して管理する
  • 様々なDBMSに対応してる

今回はMaven3で利用したが、どの形式で使用する場合も手順はだいたい同じのようだ。

コマンドラインからも実行できるので、Java以外の言語がメインのプロジェクトでも使えそう。

Flywayの使用手順

まずはMavenのpom.xmlにプラグイン設定を追加する。

設定方法は下記のページ参照:

https://flywaydb.org/documentation/maven/

設定できる内容は下記のページに一覧で掲載されている: https://flywaydb.org/documentation/maven/migrate

基本はデータベース接続情報さえ設定してやれば良い。

あと多いとしたら、SQLを管理するフォルダのパスを変更するぐらいかな?

SQL管理用フォルダのパスはデフォルトで下記のパスになっている。

src/main/resources/db/migration

「locations」設定で変更できる。

「sql/migrations」を管理用フォルダにする場合の設定例:

<plugin>
    <groupId>org.flywaydb</groupId> 
    <artifactId>flyway-maven-plugin</artifactId>
    <version>4.0</version>
    <configuration>
        <url>${jdbc.url}</url>
        <user>${jdbc.user}</user>
        <password>${jdbc.password}</password>
        <locations>
            <location>filesystem:sql/migrations</location>
        </locations>
    </configuration>
</plugin>

SQL管理用フォルダを作成して、SQLを配置する

Flywayはファイル名からバージョン番号を判断するので、ファイル名の付け方が重要。

V<バージョン番号>__<ファイル名>.sql

バージョン番号とファイル名の間はアンダースコアx2なので注意。

バージョン番号は1以上でつける。「1」とか「1.0.0」とか利用可能。 どこかに書いてあった気がするが、今探しても見つけることができなかった。

うちのチームでは下記のような感じでSQLを作成して使っている:

V1.0.1__init_db.sql
V1.0.2__add_column_to_item_table.sql

baselineコマンドでバージョン管理テーブルを作成する

初めてflywayのマイグレーションを実行する場合は、まずbaselineコマンドを実行する。 このコマンドを実行することで、マイグレーション管理用テーブルが作成される。

Mavenで実行する場合は下記のコマンドを実行する:

mvn flyway:baseline

例えば途中から参加するメンバーが特定バージョン以降のから取り込むようにしたい場合は、 「baselineVersion」設定でベースにするバージョンを指定することができる。

https://flywaydb.org/documentation/maven/baseline

migrateコマンドでマイグレーションを実行する

migrateコマンドと次に説明するinfoコマンドが、頻繁に使うコマンドになる。

mvn flyway:migrate

このコマンドを実行すると、未取込のSQLをバージョン順で実行してくれる。

infoコマンドで状態を確認する

infoコマンドはflywayのマイグレーション管理用テーブルの内容を表示するコマンドで、

どのバージョンが実行済みでどのバージョンが未実行なのかを表示してくれる。

mvn flyway:info

他にも「clean」「validate」「repair」等のコマンドがあるが、まだ使っていない。

Eclipseでflywayコマンドを実行する

MavenコマンドはEclipseにコマンドとして登録して実行することもできる。

「Runメニュー > Run Configurations...」メニューを開き、「Maven Build」を作成して、 作成画面の「Goals」に「flyway:info」のように登録すればコマンドとして登録される。 「Base Directory」はプロジェクトのルートディレクトリでOK。

おわり

ひとまずここまで押さえておけばFlywayを使うことができる。

またノウハウがたまったらまとめたい。

みんなはどんなツールを使ってるんだろうか。