【Flyway】利用手順(Gradle版)
Flyway利用時のメモを残しておく。
はじめに
Flywayとは、DBへテーブル作成やデータ投入など
バージョン管理に沿って行うDBマイグレーションツール(Flyway公式)。
掲載内容は、Gradle経由での利用手順とする。
事前準備
SQLファイル
- SQLファイルにてデータベースのバージョンを管理する。
- データベースに対応するSQLファイルをバージョンごとに作成する。
- SQLファイル名にはflyway固有のネーミングルール(書式)が決められている。
SQLファイルのネーミングルール(書式)
V<Version>__<Description>.sql
1. V
(先頭文字)
- 先頭は必ず
V
から始める(flyway規定)。
2. <Version>
(バージョン番号)
- バージョン番号を指定する。
- バージョン番号はDB投入時の実行される順番となり、小さい番号から投入される。
- バージョン番号は一意制約があり、同じバージョンのSQLファイルを用意することはできない。
基本は以下いずれの組み合わせで指定する。
※_
(アンダーバー)は実行時に.
(ドット)に自動変換される。
バージョン番号 = 半角数字 +
.
(ドット) または_
(アンダーバー)
1.0 1_2 → 実行時には1.2となる 1.1 ------ 実行される順番 ------ 1.0 → 1.1 → 1_2 となる
3. __
(アンダーバー)
<Version>
(バージョン番号)と<Description>
(説明)との区切り。_
(アンダーバー)を2つ続ける。
4. <Description>
(説明)
- バージョンの説明を記述する。
※_
(アンダーバー)は実行時に(スペース)に自動変換される。
SQLファイル名のsample
/* パターン① */ V1.01__create_sequence.sql --> シーケンスのDMLを集約:INSERT V1.02__create_table.sql --> テーブルのDDLを集約:CREATE V1.03__initial_data.sql --> 初期データのDMLを集約:INSERT
またはSQLファイル名に環境を明示することでわかりやすくなる。
/* パターン②:develop環境であることを明示的にする */ V1.01__dev_create_sequence.sql --> develop環境でのシーケンスDMLを集約:INSERT V1.02__dev_create_table.sql --> develop環境でのテーブルDDLを集約:CREATE V1.03__dev_initial_data.sql --> develop環境での初期データDMLを集約:INSERT
利用コマンド
flywayで利用するコマンド
gradle flywayMigrate
: マイグレーション
- マイグレーションを実行する。
gradle flywayBaseline -i
: バージョン管理テーブルの作成
以下の場合において、実行前にバージョン管理用テーブルを作成する必要がある。
gradle flywayInfo
: ステータス確認
ステータス | |
---|---|
Pending | 実行前 |
Success | 成功 |
Failed | 失敗 |
gradle flywayRepair
: リペア
- マイグレーションの実行ステータスがFailedになっているバージョンをPendingに戻す。
バージョン管理のSQLファイルがマイグレーションに実行失敗(一度マイグレーションが失敗)した場合、そのバージョンのステータスがFailedになる。 マイグレーションの実行状態を「Failed」→「Pending」にするために、SQLファイル修正後にリペアする必要がある。
gradle flywayClean
: 削除
- 全テーブルを削除し、指定のデータベースを再構築する。
実行手順 (マイグレーション)
以下3つのSQLファイルを準備する。
V1.01__create_sequence.sql V1.02__create_table.sql V1.03__initial_data.sql
1. Baselineを作成する
- はじめにバージョン管理用テーブル(Baseline)を作成する
gradle flywayBaseline -i
。 - Baselineができているか確認する
gradle flywayInfo
。
> gradle flywayBaseline -i :flywayBaseline (Thread[Task worker for ':',5,main]) started. > Task :flywayBaseline Putting task artifact state for task ':flywayBaseline' into context took 0.0 secs. Executing task ':flywayBaseline' (up-to-date check took 0.0 secs) due to: Task has not declared any outputs. Creating Metadata table: "FLYWAY_SAMPLE"."schema_version" Successfully baselined schema with version: 1 :flywayBaseline (Thread[Task worker for ':',5,main]) completed. Took 0.169 secs. BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed > gradle flywayInfo > Task :flywayInfo +---------+-----------------------------+---------------------+---------+ | Version | Description | Installed on | State | +---------+-----------------------------+---------------------+---------+ | 1 | << Flyway Baseline >> | 2017-01-10 15:35:01 | Baselin | | 1.01 | create sequence | 2017-01-10 15:35:28 | Pending | | 1.02 | create table | 2017-01-10 15:35:30 | Pending | | 1.03 | insert initial data | 2017-01-10 15:35:33 | Pending | +---------+-----------------------------+---------------------+---------+ BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed
2. マイグレーション実行
- Baseline作成後、マイグレーションが実行する
gradle flywayMigrate
。 - 実行後、成功していればBUILD SUCCESSFULが表示される。
flywayInfo
でステータスがPending→Successに変更されていることが確認できる。 - 実行により準備したSQLファイル(DDL・DML)がDBに反映される。
> gradle flywayMigrate BUILD SUCCESSFUL in 5s 1 actionable task: 1 executed > gradle flywayInfo > Task :flywayInfo +---------+-----------------------------+---------------------+---------+ | Version | Description | Installed on | State | +---------+-----------------------------+---------------------+---------+ | 1 | << Flyway Baseline >> | 2017-01-10 15:39:28 | Baselin | | 1.01 | create sequence | 2017-01-10 15:40:01 | Success | | 1.02 | create table | 2017-01-10 15:40:02 | Success | | 1.03 | insert initial data | 2017-01-10 15:40:05 | Success | +---------+-----------------------------+---------------------+---------+ BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed
3. リペア
- マイグレーション
gradle flywayMigrate
が失敗した場合、実行前の状態(Pending)に戻すためにリペアを実行するgradle flywayRepair
。 - 失敗したSQLファイル以降のステータスは、Pending→Failedとなる。
- 基本的には、失敗元のSQLファイル修正後にリペア
gradle flywayRepair
を実行する。
> gradle flywayInfo > Task :flywayInfo +---------+-----------------------------+---------------------+---------+ | Version | Description | Installed on | State | +---------+-----------------------------+---------------------+---------+ | 1 | << Flyway Baseline >> | 2017-01-10 16:10:21 | Baselin | | 1.01 | create sequence | 2017-01-10 16:11:11 | Success | | 1.02 | create table | 2017-01-10 16:11:12 | Failed | | 1.03 | insert initial data | 2017-01-10 16:11:15 | Failed | +---------+-----------------------------+---------------------+---------+ > gradle flywayRepair BUILD SUCCESSFUL in 5s 1 actionable task: 1 executed > gradle flywayInfo > Task :flywayInfo +---------+-----------------------------+---------------------+---------+ | Version | Description | Installed on | State | +---------+-----------------------------+---------------------+---------+ | 1 | << Flyway Baseline >> | 2017-01-10 16:10:21 | Baselin | | 1.01 | create sequence | 2017-01-10 16:11:11 | Success | | 1.02 | create table | 2017-01-10 16:11:12 | Success | | 1.03 | insert initial data | 2017-01-10 16:11:15 | Success | +---------+-----------------------------+---------------------+---------+ BUILD SUCCESSFUL in 0s 1 actionable task: 1 executed
4. 削除(クリーン)
- 削除
gradle flywayClean
実行後、対象DBに存在する全テーブルが削除される。
※実行後はもとに戻せないため、実行時は注意が必要である!
> gradle flywayClean BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed > gradle flywayInfo > Task :flywayInfo +---------+---------------------+---------------------+---------+ | Version | Description | Installed on | State | +---------+---------------------+---------------------+---------+ | 1.01 | create sequence | | Pending | | 1.02 | create table | | Pending | | 1.03 | insert initial data | | Pending | +---------+---------------------+---------------------+---------+