Flywayコールバックの手引き

1前書き

Flywayライブラリを使用すると、SQLソースコードとして格納されている変更を追跡してデータベースをバージョン管理できます。 それぞれの変更を migration と呼びます。

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

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

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

2ユースケースシナリオ

コールバックによって提供されるある種の柔軟性を必要とする非常に特別な要件があるかもしれません。いくつかの可能な使用例はここにあります:

  • マテリアライズドビューの再構築 - 再構築したいかもしれません**

マテリアライズドビュー ベースに影響するマイグレーションを適用するたびに それらのビューの表SQLコールバックはこれを実行するのに適しています ロジックの種類 キャッシュのフラッシュ - おそらく、データを変更する移行があります

それはキャッシュされることが起こります。コールバックを使って キャッシュをフラッシュ することができます。 私たちのアプリケーションがデータベースから新しいデータを引き出すことを確認してください 外部システムを呼び出す - コールバックを使って、 にコールアウトすることができます

外部システム** 任意のテクノロジを使用たとえば、イベントを公開したり、電子メールを送信したり、サーバーの再起動をトリガーしたりすることができます。

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

利用可能なFlywayコマンドのそれぞれに対応する before および after コールバックがあります。これらのコマンドの詳細については、 Flywayの主な記事 、またはhttps://flywaydb.org/documentation/[公式文書]を参照してください。

  • 各コールバックの名前は、 before または after のいずれかと、それに続くコマンド名** で構成されています。

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

はじめに説明したことを思い出してください。これらのコマンドは次のとおりです。

migrate clean、info、validate、 baseline 、および repair

各コマンドの before および after コールバックに加えて、 migrate コマンドに使用できるコールバックが2つあります。

これらのコールバックは、 beforeEachMigrate および afterEachMigrate という名前です。

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

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

4依存関係

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

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

https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.flywaydb%22%20AND%20a%3A%22flyway-core%に flyway-core の最新バージョンがあります。 22[メイヴン中央]。

5コールバック

Flywayを使用すると、JavaまたはSQLという2つの異なる方法でコールバックを作成できます。前者が最も柔軟なものです。それは私たちに任意のコードを実行する自由を与えます。

後者はデータベースと直接対話することを可能にします。

5.1. Javaコールバック

  • Java API規約は FlywayCallback インタフェースで定義されています** 便宜上、 BaseFlywayCallback が提供されており、デフォルトでは各メソッドに対して何もしない実装が行われます。

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

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コールバック

  • SQLコールバック規約は locations として設定されているディレクトリに含まれる特定の名前のファイルを使用して定義されます。

たとえば、 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 - &gt; migrateWithSqlAndJavaCallbacks
...//other log messages
2017-12-18 08:16:17,494[main]INFO  o.f.core.internal.command.DbMigrate -
  <strong>Migrating schema "PUBLIC" to version 1.0 - add table one</strong>
2017-12-18 08:16:17,494[main]INFO  c.b.f.ExampleFlywayCallback - &gt; beforeEachMigrate
2017-12-18 08:16:17,494[main]INFO  o.f.c.i.c.SqlScriptFlywayCallback -
  <strong>Executing SQL callback: beforeEachMigrate</strong>
2017-12-18 08:16:17,495[main]INFO  c.b.f.ExampleFlywayCallback - &gt; afterEachMigrate
2017-12-18 08:16:17,499[main]INFO  o.f.core.internal.command.DbMigrate -
  <strong>Migrating schema "PUBLIC" to version 1.1 - add table two</strong>
2017-12-18 08:16:17,500[main]INFO  c.b.f.ExampleFlywayCallback - &gt; beforeEachMigrate
2017-12-18 08:16:17,500[main]INFO  o.f.c.i.c.SqlScriptFlywayCallback -
  <strong>Executing SQL callback: beforeEachMigrate</strong>
2017-12-18 08:16:17,501[main]INFO  c.b.f.ExampleFlywayCallback - &gt; afterEachMigrate
2017-12-18 08:16:17,505[main]INFO  o.f.core.internal.command.DbMigrate -
  <strong>Successfully applied 2 migrations to schema "PUBLIC"</strong> (execution time 00:00.020s).

7. 結論

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

いつものように、すべてのソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/flyway[over on GitHub]にあります。