Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

FlywayのJava APIでDBのマイグレーションをする方法

Flyway の Java API を使って、データベースのマイグレーションをする方法を書いていきます。

Flyway について

Flyway を使うと、DB のバージョン管理を自動的に行えるようになります。

製品バージョン

ブログ執筆時の製品バージョンは以下の通りです。

1. プロジェクトの作成

1.1. ディレクトリ階層の作成

プロジェクトのフォルダ flyway-postgresql の下に、以下のディレクトリを作成します。

  • src/main/java
  • src/main/resources/db/migration

1.2. ビルドファイルの作成

Maven のビルドファイルを作成します。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.sample</groupId>
  <artifactId>flyway-postgresql</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.flywaydb</groupId>
      <artifactId>flyway-core</artifactId>
      <version>9.8.3</version>
    </dependency>
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.5.1</version>
    </dependency>
  </dependencies>
</project>

2. Java コードの作成

以下のプログラムを作成します。

src/main/java/org/sample/Main.java

package org.sample;

import org.flywaydb.core.Flyway;

public class Main {
  public static void main(String[] args) {
    // localhost の 5432 ポート、データベース test に、
    // ユーザー usr、パスワード pass で接続
    Flyway flyway = Flyway.configure().dataSource(
      "jdbc:postgresql://localhost:5432/flyway", "usr", "pass"
    ).load();
    // マイグレーションを開始
    flyway.migrate();
  }
}

3. マイグレーションの実行

3.1. 初回のマイグレーション

以下のファイルを作成して、上の Java プログラムを実行します。

src/main/resources/db/migration/V1__Create_memo_table.sql

CREATE TABLE memo (
  id serial PRIMARY KEY,
  txt varchar(140) NOT NULL,
  update_time timestamp NOT NULL DEFAULT current_timestamp,
  create_time timestamp NOT NULL DEFAULT current_timestamp
);

DB に接続すると、テーブルが作成されたことを確認できます。

3.2. 二回目のマイグレーション

以下のファイルを作成してプログラムを実行すると、テーブルとデータの作成を確認できます。

src/main/resources/db/migration/V2__Create_task_table.sql

CREATE TABLE task (
  id bigserial PRIMARY KEY,
  title varchar(100) NOT NULL,
  is_important boolean NOT NULL DEFAULT false,
  due_date date NOT NULL DEFAULT current_date
);

INSERT INTO task
  (title, is_important, due_date)
VALUES
  ('お米を買う', true, '2022-12-10'),
  ('お茶碗を買う', false, '2022-12-11');

今回の例のように、複数の SQL を書くこともできます。

4. SQL ファイルの名前について

デフォルトの場合、SQL ファイルの命名規則は以下の通りです

V{バージョン番号}__{任意の文字列}.sql

バージョン番号と文字列の間は、半角のアンダースコア2つになります。