- 開発技術
Spring BootにDBマイグレーションツール「flyway」を導入する
- #SpringBoot
そもそもDBマイグレーションとは
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
複数の環境を使い分けて開発をしていたり、複数人のチームで開発をしていると、DBの管理を煩わしく感じることは少なく無いと思います。
例えば自分がDBのテーブル構成を変更したのに他のチームメイトにそのことを伝え忘れてしまったら・・・。当然チームメイトの環境では上手くアプリケーションが動かないということも起こりえますし、無用なコストを掛けてしまうことにもなりかねません。
そのような時に役に立つのがDBマイグレーションツールです。
DBマイグレーションツールを使うと以下のようなメリットがあります。
・環境・開発者間のテーブル定義の差分を吸収してくれる
・DBの差分をファイルで管理できる
・DB更新忘れ防止
学習コストもそれほど高くないので、小規模の開発であっても使わない手はないと思います。
Flywayの仕組み
migrationが呼びだされると、schemaテーブルと呼ばれる、migrationのバージョンを管理するテーブルが存在するかどうかチェックをします。schemaテーブルが存在しない場合、flywayはflyway_schema_historyを作成します。このテーブルの中身が、migrationがどのバージョンまで行われたかの指標となります。
その後、migration用のSQLを読み出し、schemaテーブルに登録されていないバージョンのmigration用SQLファイルを実行します。
SQL実行が完了したら、flyway_schema_historyテーブルが更新されます。
環境
Java 17
Spring boot 2.5.6
Maven…3.8.1
MySQL…8.0
Flywayの導入方法
pom.xmlに以下のコードを追加します。
1 2 3 4 |
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> |
続いてapplication.ymlでmigrationの対象とするDBの指定をします。デフォルトの設定だと、アプリケーションの接続DBとflywayによるマイグレーション対象のDBは同じになります。
1 2 3 4 |
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」と命名します。
1 2 3 4 5 |
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アプリを立ち上げます。
コンソールに以下のような表示があれば成功しているかと思います。
1 2 |
Database: jdbc:mysql://smallit.co.jp:3307/flywaytest (MySQL 8.0) Successfully validated 1 migration (execution time 00:00.021s) |
また、テーブル構成を確認すると以下のようにBookテーブルとflyway_schema_historyテーブルが追加されていることがわかるかと思います。
1 2 3 4 5 6 |
+-----------------------+ | Tables_in_flywaytest | +-----------------------+ | Book | | flyway_schema_history | +-----------------------+ |
以上となります。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>