Flywayで実行済みなマイグレーションファイルを書き換える方法




Flywayとは

FlywayとはJavaの開発で使われるデータベースのマイグレーションツールです。使い方の詳細は下記に書いてあるので初めての方は読んでみてください。

Spring BootでFlywayを使用したMySQLのマイグレーション

Flywayのバージョン管理方法

Flywayはファイル名にV1.0.0__initial_setup.sqlのように__(アンダースコア2つ)の前半にバージョン情報、後半に説明文を記入する構成となっています。

このマイグレーションファイルをFlywayで実行するとschema_versionsというテーブルに実行結果が保存されます。

mysql> select * from schema_version;
+----------------+---------+---------------+------+---------------------------+-----------+--------------+---------------------+----------------+---------+
| installed_rank | version | description   | type | script                    | checksum  | installed_by | installed_on        | execution_time | success |
+----------------+---------+---------------+------+---------------------------+-----------+--------------+---------------------+----------------+---------+
|              1 | 1.0.0   | initial setup | SQL  | V1.0.0__initial_setup.sql | 260229630 | root         | 2018-02-22 13:42:39 |             41 |       1 |
+----------------+---------+---------------+------+---------------------------+-----------+--------------+---------------------+----------------+---------+

テーブルには実行したマイグレーションファイル名、実行日時、バージョン、ファイルのハッシュ値(checksum)などが入っています。このようにテーブルにマイグレーションの実行結果を残していくことで2重でマイグレーションを実行しないようにしたり、実行済みのマイグレーションファイルの中身が意図せず変わった時にハッシュ値が変わることで間違いを教えてくれます。

過去のマイグレーションファイルを変えたい時

Flywayを使ってマイグレーションを実行するとマイグレーションの実行順番とファイルの中身は簡単に変更することはできません。これが良いところでもあるのですが、開発中だとめんどくさい時もあるのが正直なところです。

例えば3つのファイルをすでに実行済みで1番最初に実行したファイルの中身を変えたくなった場合、4つ目のファイルでテーブルを修正するALTER文を作成して実行するのが一番の正攻法です。しかし、この方法だとどんどんファイルが増えてしまい把握がしづらくなってきます。

なので本番リリース前の開発中であればデータベースを丸ごと削除してファイルを修正し、最初からDBを作り直すのが一番楽です。けど、すでにDBにデータが入っていたり、データを消すことが困難な場合ファイルを追加していくしかないです。

ファイルを追加せずに修正する方法

これはかなりアウトローな修正方法なのでオススメしませんが、こういう方法もありますよということで紹介しときたいと思います。

まずFlywayがマイグレーションを実行する時の仕組みについてですが、Flywayは実行時にテーブルに保存しているファイル名とchecksumで実行済みのファイルのハッシュ値が同じになるか比較しています。このハッシュ値が同じ場合は何もエラーが起こりません。

しかし、マイグレーションファイルの中身を変更するとテーブルに保存されているハッシュ値と差異が出てエラーが発生します。ということはマイグレーションファイルを修正した後のハッシュ値でテーブルを更新してあげればFlywayはエラーを起こさないということです。

仕組みを理解してしまえば簡単なことなんですが、ツールを使うと中身はブラックボックスになってしまうことが多いので気をつけないといけないですね。

補足で、必要なくなったテーブルが出てきた場合はそのテーブルを作成したマイグレーションアフィルを削除してテーブルからもそのレコードを削除するだけで問題なかったです。この方法が正しいとは思えませんが一応大丈夫だったので書いておきます。

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です