Flyway の Java API を使って、データベースのマイグレーションをする方法を書いていきます。
Flyway について
Flyway を使うと、DB のバージョン管理を自動的に行えるようになります。
製品バージョン
ブログ執筆時の製品バージョンは以下の通りです。
- Java 11
- Maven 3.8.6
- Flyway 9.8.3
- PostgreSQL 15.1
- pgJDBC 42.5.1(JDBC Driver)
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つになります。