はじめに
flywayを使ってローカル環境のdocker desktop上に構築したpostgreSQLに、
テーブル作成、データ投入を行う手順をまとめました。
データベースと繋いで動作確認やテストコードを書きたい!!
尚且つ、
各開発者がローカル環境でデータベースが構築できて(DBを1つ立てて開発者全員で共有とかしたくない)、
ある程度のデータバリエーションをサクッと用意できて、
テストデータを必要に応じて追加・更新・削除自由にしたい・・・
ということを想定した場合、
flywayをどのように使えば簡単な仕組みが作れるか??
についてまとめています。
flywayとは
この辺り一度読んでもらうのが早いと思います。
が、一応簡単に解説すると、
データベースの状態(断面)を管理して、どんな環境にもどんな断面にも簡単に再現できる。
というのがflywayの特徴だとざっくり捉えてもらえればいいかなと思います。
これを実現するために、
flywayのプロジェクトにテーブル作成用のcreate文や、
初期データ登録用のinsert文をバージョンを振りながら登録しておく必要があります。
また、
flyway実行時にここのDBへ向けてこのバージョンを再現!!
という指示を与えることで指定されたバージョンのクエリだけ実行して
上のようなことが実現できるようなイメージです。
flywayでテスト用のテーブル作成やテストデータ投入行う具体的な手順
実際に動くサンプルをgithubに公開していますので、
そちら参考にしてください。
ローカル環境にDBを構築してflywayでテストデータをセットアップするまでの流れ
ローカル環境のdocker上にpostgreSQLを構築、
flywayを使って事前に準備しておいたスキーマ・テーブルcreate文と
テストデータのinsert文を実行させることで、
ローカル環境にDB構築〜テストデータセットアップしました。
flywayの実行オプションによっては指定のバージョン以降を実行するなどもできますが、
今回はローカル環境にサクッとセットアップできて、
サクッと更新できて、
サクッと壊せるようにしたかったのでその辺りは利用していません。
ローカル環境にDB構築〜flywayでテストデータをセットアップの具体的な手順をサンプルコードで解説
まずはflywayに実行させるクエリ管理用のプロジェクトをpullしてください。
別リポジトリで管理しなくてもいいですが、
ごちゃごちゃするのでプロダクションコード
(例で挙げているリポジトリでいうbackendプロジェクト)
とは別プロジェクトで管理しましょう。
ソースコード解説
flywayの利用とdb接続に必要なライブラリの依存関係をにpomに設定しています。
また、flywayがどのDBに対してクエリを実行するのかというプロパティの設定をしています。
実際に流すクエリは
>>src/main/resources/db/migration
に配置しており、
flywayはこの配下のsqlファイルを全部実行するようにします。
flyway実行
まずflyway実行の前にdocker上にpostgreSQLを構築します。
親プロジェクトフォルダ直下(docker-compose.ymlがあるところ)で
以下実行するとdocker上にpostgreSQLが構築できます。
docker-compose up -d
flywayプロジェクト直下で以下実行するとflywayがdocker上に構築したpostgreSQLに向けてsrc/main/resources/db/migration配下の全sqlを実行します。
./mvnw clean install
./mvnw flyway:clean flyway:migrate
IntelliJにプロジェクトインポートして実行する場合はこんな感じでmavenウィンドウからの実行が可能です。
実際にpostgreSQLにクライアントツールを使って繋いで
テーブルができているかの確認手順は省略しますが、
こんな感じでテーブル作成とデータ登録されているはずです。
ちなみにですが、
テストデータが変更したくなったら、
クエリを直して同じように以下コマンドを実行すれば再作成可能にするために、
V0__drop.sqlでスキーマごと削除するクエリを一番先頭で流すようにしています。
(これがなければ既にスキーマやテーブルがあるよっていうエラーになる)
./mvnw clean install
./mvnw flyway:clean flyway:migrate
まとめ
今回はflywayを利用してローカル環境でdocker上に構築したpostgreSQLに対して、
テストデータ登録済みの状態までサクッと準備できる方法について解説しました。
今回紹介したflywayの使い方以外にも、
baselineを利用してリリース対象のクエリの本番環境に
差分更新で反映させる使い方だったり、
結合環境と同じデータベースの状態で
新しいステージング環境をセットアップする際にflywayを利用したり、
他にも色々使いどころはあります。
本記事が、現状の開発プロセスにおいての何かしらの課題を解決するヒントになれば幸いです。
おまけ
今回のflyway含めた現場での開発を想定した
バックエンドのローカル開発環境構築〜実際の開発までのまとめ記事を作ったので
ぜひそちらもご覧ください
IntelliJ IDEA、docker desktop(postgreSQL、keycloak)、Flyway、DBeaverを利用したバックエンド開発環境構築