Spring BootにDBマイグレーションツール「flyway」を導入する

そもそもDBマイグレーションとは

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

複数の環境を使い分けて開発をしていたり、複数人のチームで開発をしていると、DBの管理を煩わしく感じることは少なく無いと思います。

例えば自分がDBのテーブル構成を変更したのに他のチームメイトにそのことを伝え忘れてしまったら・・・。当然チームメイトの環境では上手くアプリケーションが動かないということも起こりえますし、無用なコストを掛けてしまうことにもなりかねません。

そのような時に役に立つのがDBマイグレーションツールです。

DBマイグレーションツールを使うと以下のようなメリットがあります。

  • 環境・開発者間のテーブル定義の差分を吸収してくれる
  • DBの差分をファイルで管理できる
  • DB更新忘れ防止

学習コストもそれほど高くないので、小規模の開発であっても使わない手はないと思います。

Flywayの仕組み

migrationが呼びだされると、schemaテーブルと呼ばれる、migrationのバージョンを管理するテーブルが存在するかどうかチェックをします。schemaテーブルが存在しない場合、flywayflyway_schema_historyを作成します。このテーブルの中身が、migrationがどのバージョンまで行われたかの指標となります。

その後、migration用のSQLを読み出し、schemaテーブルに登録されていないバージョンのmigrationSQLファイルを実行します。 

SQL実行が完了したら、flyway_schema_historyテーブルが更新されます。

環境

  • Java 17
  • Spring boot 2.5.6
  • Maven…3.8.1
  • MySQL…8.0

Flywayの導入方法

pom.xmlに以下のコードを追加します。

続いてapplication.ymlmigrationの対象とするDBの指定をします。デフォルトの設定だと、アプリケーションの接続DBflywayによるマイグレーション対象のDBは同じになります。

spring.datasource.url=jdbc:mysql://smallit.co.jp:3307/flywaytest

spring.datasource.username=root

spring.datasource.password=mysql

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

 

SQLファイルの追加

migration用のSQLファイルの準備をします。

Spring Bootではデフォルトで、/resources/db/migration/にマイグレーションファイルを配置するように指定されているため、特に理由がなければそちらにファイルを配置しましょう。

Flywayではマイグレーションファイルの命名規則がきっちり定まっているので、そちらに則って命名するようにしてください。命名規則は以下の通り、

V<バージョン>__<任意の名前>.sql

この記事では以下の内容のSQLファイルを作成し、「V1.0.0__Book.sql」と命名します。

Spring Bootの起動

実は上記の設定だけでflywayは実行可能な状態になっています。あとはいつものようにSpring Bootアプリケーションを起動するだけです。

Eclipseの場合であれば、「実行(R)Spring Bootアプリケーション」でSpring Bootアプリを立ち上げます。

コンソールに以下のような表示があれば成功しているかと思います。

また、テーブル構成を確認すると以下のようにBookテーブルとflyway_schema_historyテーブルが追加されていることがわかるかと思います。

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス