1前書き

この記事ではhttps://flywaydb.org/[

Flyway

]の重要な概念と、このフレームワークを使用してアプリケーションのデータベーススキーマを確実かつ簡単に継続的に再構築する方法について説明します。最後に、Maven Flywayプラグインを使用してインメモリH2データベースを管理する例を示します。

Flywayはマイグレーションを使用してデータベースをあるバージョンから次のバージョンに更新します。

データベース固有の構文を使用したSQLまたは高度なデータベース変換用のJavaのいずれかで移行を記述できます。

移行は、バージョン対応にすることも反復可能にすることもできます。前者はユニークなバージョンを持ち、一度だけ適用されます。後者にはバージョンがありません。代わりに、チェックサムが変わるたびに(再)適用されます。

単一のマイグレーション実行内で、保留中のバージョン付きマイグレーションが実行された後、反復可能マイグレーションは常に最後に適用されます。反復可能な移行はそれらの記述順に適用されます。単一マイグレーションの場合、すべてのステートメントは単一データベース・トランザクション内で実行されます。

この記事では、主にMavenプラグインを使用してデータベースの移行を実行する方法について説明します。


2 Flyway Mavenプラグイン

Flyway Mavenプラグインをインストールするには、__pom.xmlに次のプラグイン定義を追加してください。

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>4.0.3</version>
</plugin>


Maven repository

で入手可能なプラグインの最新バージョンを確認できます。

このMavenプラグインは4つの異なる方法で設定することができます。すべての設定可能なプロパティのリストを得るためにhttps://flywaydb.org/documentation/maven/migrate[documentation]を参照してください。


2.1. プラグイン設定


pom.xmlのプラグイン定義内の

<configuration> __タグを使用して、プラグインを直接設定できます。

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>4.0.3</version>
    <configuration>
        <user>databaseUser</user>
        <password>databasePassword</password>
        <schemas>
            <schema>schemaName</schema>
        </schemas>
        ...
    </configuration>
</plugin>


2.2. Mavenのプロパティ


pom.xmlで設定可能なプロパティをMaven

properties__として指定してプラグインを設定することもできます。

<project>
    ...
    <properties>
        <flyway.user>databaseUser</flyway.user>
        <flyway.password>databasePassword</flyway.password>
        <flyway.schemas>schemaName</flyway.schemas>
        ...
    </properties>
    ...
</project>


2.3. 外部設定ファイル

別の

.properties

ファイルでプラグイン設定を提供することもできます。

flyway.user=databaseUser
flyway.password=databasePassword
flyway.schemas=schemaName
...

デフォルトの設定ファイル名は

flyway.properties

で、

pom.xml

ファイルと同じディレクトリに存在する必要があります。エンコードは

flyway.encoding

で指定されます(デフォルトは

UTF-8

)。

設定ファイルとして他の名前(

customConfig.properties

など)を使用している場合は、Mavenコマンドを呼び出すときに明示的に指定する必要があります。

$ mvn -Dflyway.configFile=customConfig.properties


2.4. システムプロパティ

最後に、コマンドラインでMavenを起動するときに、すべての設定プロパティもシステムプロパティとして指定できます。

$ mvn -Dflyway.user=databaseUser -Dflyway.password=databasePassword
  -Dflyway.schemas=schemaName

構成が複数の方法で指定されている場合の優先順位は次のとおりです。

  1. システムプロパティ

  2. 外部設定ファイル

  3. Mavenのプロパティ

  4. プラグイン設定


3移行例

このセクションでは、Mavenプラグインを使用してデータベーススキーマをインメモリH2データベースに移行するために必要な手順について説明します。 Flywayを設定するために外部ファイルを使います。


3.1. POMを更新する

__pom.xmlにH2データベース用の適切なデータベースドライバ依存関係を追加します。

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.196</version>
</dependency>


3.2. 外部ファイルを使用してFlywayを設定する

以下の内容で

$ PROJECT

ROOT



myFlywayConfig.properties__というファイルを作成します。

flyway.user=databaseUser
flyway.password=databasePassword
flyway.schemas=app-db
flyway.url=jdbc:h2:mem:DATABASE
flyway.locations=filesystem:db/migration

上記の設定は、私たちの移行スクリプトが

db/migration

ディレクトリにあることを指定します。

databaseUser



databasePassword

を使用して、インメモリH2インスタンスに接続します。

アプリケーションデータベーススキーマは

app-db

です。

flyway.user、flyway.password、flyway.url

をデータベースのユーザー名、データベースのパスワード、データベースのホスト/ポートに適切に置き換えてください。


3.3. 最初の移行を定義する

Flywayは、移行スクリプトについて次の命名規則に従います。


<接頭辞> <バージョン>


<説明> .sql

どこで:


  • <Prefix>

    – デフォルトのプレフィックスは

    V

    です。

上記の設定ファイルは

flyway.sqlMigrationPrefix

プロパティを使用しています。


  • <バージョン>

    – 移行バージョン番号。メジャーバージョンとマイナーバージョン


アンダースコア

で区切ってください。移行バージョンは常に1から始まります。


  • <説明>

    – 移行の説明文。の

説明はバージョン番号と二重下線で区切る必要があります。

例:

V1

1

0


my

first

migration.sql


V1

0

__create

employee

schema.sql

という名前の移行スクリプトを使用して、

$ PROJECT

ROOT

にディレクトリ

db/migration__を作成します。従業員テーブル

CREATE TABLE IF NOT EXISTS `employee` (

    `id` int NOT NULL AUTO__INCREMENT PRIMARY KEY,
    `name` varchar(20),
    `email` varchar(50),
    `date__of__birth` timestamp

)ENGINE=InnoDB DEFAULT CHARSET=UTF8;


3.4. 移行を実行する

データベースの移行を実行するには、

$ PROJECT

ROOT__から次のMavenコマンドを呼び出します。

$ mvn clean flyway:migrate -Dflyway.configFile=myFlywayConfig.properties

これにより、最初の移行が成功するはずです。データベーススキーマは次のようになります。

employee:
+----+------+-------+---------------+
| id | name | email | date__of__birth |
+----+------+-------+---------------+

サブセクション3.3からのステップを繰り返してください。 3.4。意のままに新しい移行を定義して実行する。


3.5. 2番目の移行を定義して実行する

次の2つのクエリを含む、

V2

0

create

department

schema.sql

という名前の2番目の移行ファイルを作成します。

CREATE TABLE IF NOT EXISTS `department` (

`id` int NOT NULL AUTO__INCREMENT PRIMARY KEY,
`name` varchar(20)

)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

ALTER TABLE `employee` ADD `dept__id` int AFTER `email`;

上記のセクション3.4で述べたのと同様の移行を実行します。 2回目の移行が正常に実行されると、データベーススキーマは次のようになります。

employee:
+----+------+-------+---------+---------------+
| id | name | email | dept__id | date__of__birth |
+----+------+-------+---------+---------------+

department:
+----+------+
| id | name |
+----+------+

$ mvn flyway:info -Dflyway.configFile=myFlywayConfig.properties


4 Flywayのしくみ

どの移行がいつ、誰によって適用されたかを追跡するために、特別な簿記テーブルがスキーマに追加されます。このメタデータテーブルは、移行チェックサム、および移行が成功したかどうかも追跡します。

フレームワークは、進化するデータベーススキーマに対応するために次の手順を実行します。

  1. データベーススキーマをチェックして、そのメタデータテーブルを見つけます.

(デフォルトでは

SCHEMA

VERSION__)。メタデータテーブルが存在しない場合は、
作成します
。利用可能な移行についてアプリケーションのクラスパスをスキャンします。

  1. 移行をメタデータテーブルと比較します. バージョン番号

現在のバージョンとしてマークされているバージョン以下で、無視されます
。残りの移行は保留中の移行としてマークされます。これらは

バージョン番号に基づいてソートされ、順番に実行されます。
。各移行が適用されると、メタデータテーブルが更新されます。

それに応じて


5コマンド

Flywayはデータベースの移行を管理するために次の基本コマンドをサポートします。



  • Info

    :

    データベーススキーマの現在のステータス/バージョンを表示します。それ

どのマイグレーションが保留中であるか、どのマイグレーションが適用されたか、適用されたマイグレーションの状況およびそれらがいつ適用されたかを出力します。



  • Migrate

    :

    データベーススキーマを現在のバージョンに移行します。それ

利用可能な移行についてクラスパスをスキャンし、保留中の移行を適用します。



  • Baseline

    :

    既存のデータベースをベースライン化します。


baselineVersion

を含む移行。ベースラインは既存のデータベースでFlywayから始めるのを助けます。その後、新しいマイグレーションを通常どおりに適用できます。



  • Validate

    :

    現在のデータベーススキーマを利用可能なものに対して検証します。

移行。



  • Repair

    :

    メタデータテーブルを修復します。



  • Clean

    :

    設定されたスキーマ内のすべてのオブジェクトを削除します。全データベース

オブジェクトはドロップされます。もちろん、本番データベースでは決してcleanを使用しないでください。


6. 結論

この記事では、Flywayのしくみと、このフレームワークを使用してアプリケーションデータベースを確実に再構築する方法を説明しました。

この記事に付随するコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/flyway[Github]にあります。