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

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

複数の環境を使い分けて開発をしていたり、複数人のチームで開発をしていると、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に以下のコードを追加します。

<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

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

spring.datasource.url=jdbc:mysql://localhost:3307/flywaytest
spring.datasource.username=root
spring.datasource.password=mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost: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」と命名します。

CREATE TABLE `Book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

Spring Bootの起動

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

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

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

Database: jdbc:mysql://localhost:3307/flywaytest (MySQL 8.0)
Successfully validated 1 migration (execution time 00:00.021s)

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

+-----------------------+
| Tables_in_flywaytest  |
+-----------------------+
| Book                    |
| flyway_schema_history |
+-----------------------+

Smallitのサービス