元柔道整復師エンジニアBlog

- 元柔道整復師エンジニアBlog -

『 エンジニアをリングする。』

【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 : リペア

バージョン管理の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でステータスがPendingSuccessに変更されていることが確認できる。
  • 実行により準備したSQLファイル(DDLDML)が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ファイル以降のステータスは、PendingFailedとなる。
  • 基本的には、失敗元の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 |
  +---------+---------------------+---------------------+---------+