Ein Leitfaden für Flyway-Rückrufe

Ein Leitfaden für Flyway-Rückrufe

1. Einführung

Mit der Flyway-Bibliothek können wir Datenbanken versionieren, indem wir Änderungen verfolgen, die als SQL-Quellcode gespeichert sind. Each set of changes is referred to as a migration.

Einzelne Migrationen werden nacheinander mit einer Reihe von Befehlen auf eine Datenbank angewendet, diemigrate,clean, info, validate,baseline undrepair enthalten. Sie werden entsprechend der aktuellen Version der Zieldatenbank kontrolliert angewendet.

Während Migrationen normalerweise ausreichen, um die meisten Anwendungsfälle abzudecken, gibt es eine Reihe von Szenarien, die für Rückrufe gut geeignet sind.

In diesem Artikel verwenden wir Flyway-Rückrufe, um den Lebenszyklus für die verschiedenen darin enthaltenen Befehle zu verknüpfen.

2. Anwendungsfallszenarien

Wir haben möglicherweise eine ganz bestimmte Anforderung, die die Flexibilität erfordert, die Rückrufe bieten. Hier sind einige mögliche Anwendungsfälle:

  • Rebuilding materialized views – möchten wir möglicherweiserebuild materialized views, wenn wir Migrationen anwenden, die sich auf die Basistabellen dieser Ansichten auswirken. SQL-Rückrufe eignen sich gut zum Ausführen dieser Art von Logik

  • Flushing a cache – Vielleicht haben wir eine Migration, die Daten ändert, die zufällig zwischengespeichert werden. Wir können Rückrufe anflush caches verwenden, um sicherzustellen, dass unsere Anwendung frische Daten aus der Datenbank abruft

  • Calling an external system – verwenden Rückrufe, wir könnencall out to an external system mit einer beliebigen Technologie. Beispielsweise möchten wir möglicherweise ein Ereignis veröffentlichen, eine E-Mail senden oder einen Serverneustart auslösen

3. Unterstützte Rückrufe

Für jeden verfügbaren Flyway-Befehl gibt es einen entsprechenden Rückruf vonbefore undafter. Weitere Informationen zu diesen Befehlen finden Sie unterour main Flyway article oderofficial documentation.

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

Beispielsweise sind die Rückrufe für den BefehlcleanbeforeClean undafterClean. Callbacks werden unmittelbar vor und nach der Ausführung ausgelöst.

Unter Hinweis auf das, was wir in der Einführung besprochen haben, sind diese Befehle:migrate,clean, info, validate,baseline undrepair.

Zusätzlich zu den Rückrufenbefore undafter für jeden Befehl stehen für den Befehlmigrate zwei zusätzliche Rückrufe zur Verfügung. Diese Rückrufe heißenbeforeEachMigrate undafterEachMigrate.

Der Befehlmigrate enthält diese zusätzlichen Rückrufe, da häufig das Ausführen des Befehlsmigrate zur Ausführung vieler Migrationen führt.

Die Autoren von Flyway haben diese zusätzlichen Hooks bereitgestellt, um die Kontrolle über die benutzerdefinierte Callback-Logik auf der höchsten Ebene der Granularität zu ermöglichen, mit der Flyway arbeitet, dh der individuellen Migration.

4. Abhängigkeiten

Um zu sehen, wie die Rückrufe in der Praxis funktionieren, lassen Sie uns ein einfaches Beispiel durcharbeiten. Wir können mit unserem Beispiel beginnen, indem wir den Flyway-Kern als Abhängigkeit in unserenpom.xml deklarieren:


    org.flywaydb
    flyway-core
    5.0.2

Wir können die neuesten Versionen vonflyway-core aufMaven Central finden.

5. Rückrufe

Flyway ermöglicht es uns, Rückrufe mit zwei verschiedenen Ansätzen, Java oder SQL, zu erstellen. Ersteres ist das flexibelste. Es gibt uns die Freiheit, beliebigen Code auszuführen.

Letzteres lässt uns direkt mit der Datenbank interagieren.

5.1. Java-Rückrufe

The Java API contract is defined in the FlywayCallback interface. Der Einfachheit halber wird einBaseFlywayCallback bereitgestellt, das standardmäßig für jede Methode eine No-Op-Implementierung verwendet.

Im einfachsten Fall umfasst das Implementieren eines Rückrufs das Erweitern vonBaseFlywayCallback und das Überschreiben der gewünschten Methode (n) wie in unserenExampleFlywayCallback:

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-Rückrufe

The SQL callback contract is defined by using files with specific names contained in directories that are configured as locations(s). Flyway sucht in den konfiguriertenlocations(s) nach SQL-Rückrufdateien und führt sie entsprechend aus.

Beispielsweise würde eine Datei mit dem NamenbeforeEachMigrate.sql in einem alslocation konfigurierten Verzeichnis vor jedem Migrationsskript während der Ausführung des Befehlsmigrate ausgeführt.

6. Konfiguration und Ausführung

Im folgenden Beispiel konfigurieren wir unseren Java-Callback und geben zwei Speicherorte für SQL-Skripte an: einen mit unseren Migrationen und einen mit SQL-Callbacks.

Es ist nicht erforderlich, separate Speicherorte für Migrationen und SQL-Rückrufe zu konfigurieren. In unserem Beispiel wird dies jedoch so eingerichtet, um zu demonstrieren, wie diese getrennt gehalten werden können:

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

Wenn wir sowohl in Java als auch in SQL einbeforeEachMigrate definieren, ist es hilfreich zu wissen, dass der Java-Rückruf zuerst ausgeführt wird und unmittelbar gefolgt von der Ausführung des SQL-Rückrufs.

Dies geht aus der Ausgabe des obigen Tests hervor:

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. Fazit

In diesem Artikel wurde untersucht, wie der Flyway-Rückrufmechanismus sowohl in Java als auch in SQL verwendet werden kann. Wir haben mögliche Anwendungsfälle untersucht und ein Beispiel aufgeführt.

Wie immer kann der gesamte Quellcodeover on GitHub gefunden werden.