親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

Spring BootでFlywayを使ったマイグレーション


Spring Bootのマイグレーション

開発をするにあたってDBのバージョン管理をしっかりするためにもマイグレーションは必要です。
Spring Bootでは、Flywayを使えばとても楽にマイグレーションを行うことができます。

※この手順では、application.ymlなどに以下のような設定があり、データベースとの接続設定は完了しているものとします。

例)

spring:
  datasource:
    url: jdbc:mysql://localhost/test-database?useSSL=false&characterEncoding=UTF-8
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver

Flywayライブラリの追加

まず、Flywayライブラリを使うためにpom.xmlに以下を追加してください。

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

もちろんMavenの再読み込みは忘れずに。



マイグレーションパッケージ、ファイルの作成

次に、src/main/resourcesにdb.migrationパッケージを作成してください。

これで準備OKです。
めちゃめちゃ簡単ですね。

マイグレーションファイルは、「V + バージョン番号__任意のファイル名.sql」といった形式で作成してください。
例えば以下のようになります。
V1__create-users.sql
V2__create-products.sql
V3__alter-users.sql

任意のファイル名の箇所は本当に何でも良いですが、後で見た時に意味がわかるようなファイル名にしておきましょう。
マイグレーションファイルは、開発を重ねるほどどんどん増えていくため、内容によってファイル名のルールを決めておくと良いでしょう。

例としてUsersテーブルを作成するマイグレーションファイルを作成します。

V1__create-users.sql

create table users (
    id integer primary key,
    mail_address varchar(255),
    password char(30),
    updated_at timestamp not null default current_timestamp,
    created_at timestamp not null default current_timestamp
);

通常のSQLのDDL文ですよね。
この状態でアプリケーションを起動させると、usersテーブルが作成されます。

バージョン情報はschema_versionというテーブルで履歴が管理され、アプリケーション実行時に未反映のマイグレーション処理が実行されます。
初回の実行時にはschema_versionテーブルは存在していないはずなので、そのような場合は勝手にテーブルは作成されるので心配いりません。

マイグレートに失敗した場合

例えばシンタックスエラーなど、SQLが失敗する要因はいくつかあると思いますが、失敗した場合、scheme_versionテーブルの該当のバージョンのsuccessカラムの値が0のままになります。(成功した場合は1になります。)

この状態でSQLを修正して再実行しても上手くいきません。
再度実行したい場合は、該当のバージョンのレコードを削除してから再実行しましょう。
失敗時の再実行に関しては少し面倒ですね。


Fire TV Stick

Fire TV Stick

新登場  Fire TV Stick 4K - Alexa対応音声認識リモコン付属

新登場 Fire TV Stick 4K - Alexa対応音声認識リモコン付属

Fire HD 10 タブレット (10インチHDディスプレイ) 64GB

Fire HD 10 タブレット (10インチHDディスプレイ) 64GB