Flywayコールバックの手引き

フライウェイコールバックのガイド

1. 前書き

Flywayライブラリを使用すると、SQLソースコードとして保存された変更を追跡して、データベースをバージョン管理できます。 Each set of changes is referred to as a migration.

個々の移行は、migrateclean, info, validate,baseline、およびrepairを含む一連のコマンドを使用してデータベースに順番に適用されます。 それらは、ターゲットデータベースの現在のバージョンに従って、制御された方法で適用されます。

通常、ほとんどのユースケースをカバーするには移行で十分ですが、コールバックに適したシナリオがいくつかあります。

この記事では、Flywayコールバックを使用して、提供されるさまざまなコマンドのライフサイクルにフックします。

2. ユースケースシナリオ

コールバックによって提供される一種の柔軟性を必要とする非常に特定の要件がある場合があります。 以下にいくつかの可能なユースケースを示します。

  • Rebuilding materialized views –これらのビューのベーステーブルに影響を与える移行を適用するときはいつでも、rebuild materialized viewsにしたい場合があります。 SQLコールバックは、このタイプのロジックの実行に適しています

  • Flushing a cache –おそらく、キャッシュされたデータを変更する移行があります。 flush cachesへのコールバックを使用して、アプリケーションがデータベースから新しいデータをプルするようにすることができます

  • Calling an external system –はコールバックを使用し、call out to an external systemは任意のテクノロジーを使用できます。 たとえば、イベントを公開したり、メールを送信したり、サーバーの再起動をトリガーしたりできます。

3. サポートされているコールバック

使用可能なFlywayコマンドごとに、対応するbeforeおよびafterコールバックがあります。 これらのコマンドの詳細については、our main Flyway articleまたはofficial documentationを参照してください。

The name of each callback consists of either before or after, followed by the command name

たとえば、cleanコマンドのコールバックはbeforeCleanafterCleanです。 コールバックは、実行の直前と直後に発生します。

はじめに説明したことを思い出してください。これらのコマンドは、migrateclean, info, validate,baseline、およびrepairです。

各コマンドのbeforeおよびafterコールバックに加えて、migrateコマンドで使用できる2つの追加のコールバックがあります。 これらのコールバックには、beforeEachMigrateおよびafterEachMigrateという名前が付けられています。

migrateコマンドを実行すると多くの移行が実行されることが多いため、migrateコマンドはこれらの追加のコールバックを備えています。

Flywayの作成者は、これらの追加フックを提供して、Flywayが動作する最高レベルの粒度、つまり個別の移行でカスタムコールバックロジックを制御できるようにしました。

4. 依存関係

コールバックが実際にどのように機能するかを確認するために、簡単な例を見てみましょう。 pom.xmlの依存関係としてflyway-coreを宣言することで、この例を開始できます。


    org.flywaydb
    flyway-core
    5.0.2

Maven Centralflyway-coreの最新バージョンを見つけることができます。

5. コールバック

Flywayを使用すると、JavaまたはSQLの2つの異なるアプローチを使用してコールバックを作成できます。 前者が最も柔軟です。 任意のコードを実行する自由を提供します。

後者では、データベースと直接やり取りできます。

5.1. Javaコールバック

The Java API contract is defined in the FlywayCallback interface.便宜上、BaseFlywayCallbackが提供されており、デフォルトでは各メソッドの操作なしの実装になっています。

最も単純なケースでは、コールバックの実装には、ExampleFlywayCallbackのように、BaseFlywayCallbackを拡張し、目的のメソッドをオーバーライドすることが含まれます。

public class ExampleFlywayCallback extends BaseFlywayCallback {

    private Log log = LogFactory.getLog(getClass());

    @Override
    public void afterEachMigrate(Connection connection, MigrationInfo info) {
        log.info("> afterEachMigrate");
    }

    // other methods
}

5.2. SQLコールバック

The SQL callback contract is defined by using files with specific names contained in directories that are configured as locations(s). Flywayは、構成されたlocations(s)でSQLコールバックファイルを検索し、それに応じて実行します。

例として、locationとして構成されたディレクトリ内のbeforeEachMigrate.sqlという名前のファイルは、migrateコマンドの実行中に各移行スクリプトの前に実行されます。

6. 構成と実行

次の例では、Javaコールバックを設定し、2つのSQLスクリプトの場所を指定します。1つは移行を含み、もう1つはSQLコールバックを含みます。

移行とSQLコールバック用に別々の場所を構成する必要はありませんが、この例では、これらを別々に保つ方法を示すために、このように設定します。

@Test
public void migrateWithSqlAndJavaCallbacks() {
    Flyway flyway = new Flyway();
    flyway.setDataSource(dataSource);
    flyway.setLocations("db/migration", "db/callbacks");
    flyway.setCallbacks(new ExampleFlywayCallback());
    flyway.migrate();
}

JavaとSQLの両方でbeforeEachMigrateを定義する場合、Javaコールバックが最初に実行され、直後にSQLコールバックが実行されることを知っておくと役立ちます。

これは、上記のテストの出力で確認できます。

2017-12-18 08:16:17,413 [main] INFO  c.b.f.FlywayApplicationTest - > migrateWithSqlAndJavaCallbacks
... // other log messages
2017-12-18 08:16:17,494 [main] INFO  o.f.core.internal.command.DbMigrate -
  Migrating schema "PUBLIC" to version 1.0 - add table one
2017-12-18 08:16:17,494 [main] INFO  c.b.f.ExampleFlywayCallback - > beforeEachMigrate
2017-12-18 08:16:17,494 [main] INFO  o.f.c.i.c.SqlScriptFlywayCallback -
  Executing SQL callback: beforeEachMigrate
2017-12-18 08:16:17,495 [main] INFO  c.b.f.ExampleFlywayCallback - > afterEachMigrate
2017-12-18 08:16:17,499 [main] INFO  o.f.core.internal.command.DbMigrate -
  Migrating schema "PUBLIC" to version 1.1 - add table two
2017-12-18 08:16:17,500 [main] INFO  c.b.f.ExampleFlywayCallback - > beforeEachMigrate
2017-12-18 08:16:17,500 [main] INFO  o.f.c.i.c.SqlScriptFlywayCallback -
  Executing SQL callback: beforeEachMigrate
2017-12-18 08:16:17,501 [main] INFO  c.b.f.ExampleFlywayCallback - > afterEachMigrate
2017-12-18 08:16:17,505 [main] INFO  o.f.core.internal.command.DbMigrate -
  Successfully applied 2 migrations to schema "PUBLIC" (execution time 00:00.020s).

7. 結論

この記事では、FlywayコールバックメカニズムをJavaとSQLの両方でどのように使用できるかを説明しました。 可能なユースケースを見て、例を詳しく説明しました。

いつものように、すべてのソースコードはover on GitHubで見つけることができます。