素敵なサムシングを独断と偏見で一方的に紹介するブログ(´・ω・`)

投稿日: 2019年4月16日
最終更新日:

【DBマイグレーション】GradleにFlywayを組み込んでパッチ適用を自動化しよう【SpringBoot2】

YouTubeも見てね♪

ねこじゃすり

created by Rinker
PEPPY(ペピイ)
¥3,850 (2024/03/15 19:03:46時点 Amazon調べ-詳細)

猫を魅了する魔法の装備品!

Anker PowerCor

created by Rinker
Anker
¥4,990 (2024/03/15 15:06:44時点 Amazon調べ-詳細)

旅行には必須の大容量モバイルバッテリー!

レッドブル エナジードリンク 250ml×24本

created by Rinker
Red Bull(レッドブル)
¥4,080 (2024/03/15 19:03:47時点 Amazon調べ-詳細)

翼を授けよう!

ドラゴンクエスト メタリックモンスターズギャラリー メタルキング

created by Rinker
スクウェア・エニックス(SQUARE ENIX)
¥3,250 (2024/03/15 19:03:48時点 Amazon調べ-詳細)

みんな大好き経験値の塊をデスクに常備しておこう!

Bauhutte ( バウヒュッテ ) 昇降式 L字デスク ブラック BHD-670H-BK

created by Rinker
Bauhutte(バウヒュッテ)
¥13,861 (2024/03/15 15:06:46時点 Amazon調べ-詳細)

メインデスクの横に置くのにぴったりなおしゃれな可動式ラック!

BANDAI SPIRITS ULTIMAGEAR 遊戯王 千年パズル 1/1スケール

created by Rinker
BANDAI SPIRITS(バンダイ スピリッツ)
¥7,180 (2024/03/15 15:06:46時点 Amazon調べ-詳細)

もう一人の僕を呼び覚ませ!!

MOFT X 【新型 ミニマム版】 iPhone対応 スマホスタンド

created by Rinker
MOFT
¥2,880 (2024/03/15 19:06:03時点 Amazon調べ-詳細)

Amazon一番人気のスマホスタンド!カード類も収納出来てかさ張らないのでオススメです!

パッチ管理を簡単にしよう

前回は、APIシステムをレイヤー構造にリファクタリングして動くところまでをご紹介しました。

今回は、データベース接続をするための準備として、DB定義用のパッチSQLファイルを用意し、Gradle経由でFlywayを用いて自動で適用させるところまでを整えていこうと思います。

Flywayとは

Flywayは、オープンソースで開発されているデータベースのマイグレーションツールです。


Version control for your database.
Robust schema evolution across all your environments.
With ease, pleasure and plain SQL.Flyway by Boxfuse • Database Migrations Made Easy.

特定のルールに沿ってパッチファイルを管理することで、コマンドライン一発でDBのマイグレーションを行うことが出来るので、当て忘れや順番を間違えたりなどのヒューマンエラーを避ける事が出来ます。

また、簡単にデータベースをリセットしたり、afterMigrate機能を使って開発データを入れる事が出来るので開発においても非常に有効なツールとなっています。

今回はGradleのSpringBootプロジェクトへのFlywayの導入方法簡単なマイグレーション処理をご紹介していこうと思います。

手順

完成系

今回は以下のような非常にシンプルなテーブル構造を作ってみようと思います。

テーブル名 用途
account.accounts アカウントのメインレコードを管理
account.account_infomations アカウントの基本情報を管理
account.sex_types 性別マスター
account.current_account_infomations 各アカウントの基本情報レコードは蓄積を想定するため、現在の有効な基本情報をマッピングするためのテーブル

application-{profile}.ymlの設定

まずは、Flywayを実行するにあたって必要な項目をapplication-{profile}.ymlに定義していきます。

なお、springbootには公式でFlywayの設定項目がありますが、今回は設定が反映されてしまって起動時に自動実行させたくないのもあるため、意図的にflywayMigrateという独自階層で定義していきます。

build.gradleの修正

datasourceプロジェクト

今回はシステム内部からFlywayを呼ぶことは想定していないので、dependenciesへの追加は不要です。

代わりにGradleから実行するためにpluginsに指定をする必要があります。

datasource/build.gradleを以下のように修正してみました。

devtoolsプロジェクト

devtools/build.gradleではgradle実行時に必要なPostgreSQLのドライバーとymlファイルを読み込むためのライブラリをクラスパスに追加します。

パッチファイル

次にパッチファイルを用意しましょう。今回は以下のような形で用意しました。

afterMigrateファイル

次にafterMigrateファイルを用意しましょう。

afterMigrateとは、パッチファイルの適用が終了した際に一度だけ適用されるSQLファイルの事を指します。

こちらを使うことで、各環境で同一データを使って動作確認を行ったり、簡単にデータベースのデータを同一の状態に戻すことが出来るのでとても便利です♪

実行確認

以下のコマンドを実行してみてください。

確認

それでは、DBの中身を見てみましょう。

正常にデータベース構造が構築され、AfterMigrateのデータも登録されていることが分かりますね♪

Flywayの適用状態はpublic.flyway_schema_historyが自動で生成されてそちらで管理されます。

また、afterMigrateを行いたくない場合はisAfterMigratablefalseにするだけでスキップされます。

検証や本番ではfalseにしておくと良いでしょう。

最初からDB定義を作り直したい場合

ローカル開発等で現在のデータベース構造をリセットして、最初からパッチやafterMigrateを当て直したい場合は、SPRING_PROFILES_ACTIVE=local ./gradlew flywayClean flywayMigrateで簡単に出来ちゃいます。

終わりに

これでDB定義の更新がコマンド一つでサクッと出来るようになりました。

次回はStubにしているデータソースの処理を実際にDBから取得するように変えていきたいと思います。

CATEGORIES & TAGS

IT