Guide sur les rappels de voies de migration

Guide sur les rappels de voies de migration

1. introduction

La bibliothèque Flyway nous permet de versionner les bases de données en suivant les modifications stockées sous forme de code source SQL. Each set of changes is referred to as a migration.

Les migrations individuelles sont appliquées à une base de données de manière séquentielle à l'aide d'un ensemble de commandes qui incluentmigrate,clean, info, validate,baseline etrepair. Ils sont appliqués de manière contrôlée en fonction de la version actuelle de la base de données cible.

Bien que les migrations soient généralement suffisantes pour couvrir la plupart des cas d'utilisation, il existe un certain nombre de scénarios bien adaptés aux rappels.

Dans cet article, nous utiliserons les rappels Flyway pour nous connecter au cycle de vie des différentes commandes qu'il fournit.

2. Scénarios de cas d'utilisation

Nous pouvons avoir une exigence très spécifique qui nécessite le type de flexibilité offerte par les rappels. Voici quelques cas d'utilisation possibles:

  • Rebuilding materialized views – nous pourrions vouloirrebuild materialized views chaque fois que nous appliquons des migrations affectant les tables de base de ces vues. Les callbacks SQL conviennent parfaitement à l'exécution de ce type de logique

  • Flushing a cache – peut-être avons-nous une migration qui modifie les données qui se trouvent être mises en cache. Nous pouvons utiliser des rappels versflush caches en nous assurant que notre application extrait de nouvelles données de la base

  • Calling an external system – en utilisant des callbacks, nous pouvonscall out to an external system en utilisant une technologie arbitraire. Par exemple, nous pouvons souhaiter publier un événement, envoyer un courrier électronique ou déclencher un redémarrage du serveur.

3. Rappels pris en charge

Il existe un rappel correspondantbefore etafter pour chacune des commandes Flyway disponibles. Pour plus d'informations sur ces commandes, reportez-vous auxour main Flyway article ou auxofficial documentation.

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

Par exemple, les rappels pour la commandeclean sontbeforeClean etafterClean. Les rappels sont déclenchés immédiatement avant et après l'exécution.

Rappelant ce que nous avons discuté dans l'introduction, ces commandes sont:migrate,clean, info, validate,baseline etrepair.

En plus des rappelsbefore etafter pour chaque commande, 2 rappels supplémentaires sont disponibles pour la commandemigrate. Ces rappels sont nommésbeforeEachMigrate etafterEachMigrate.

La commandemigrate propose ces rappels supplémentaires car il arrive souvent que l'exécution de la commandemigrate entraîne l'exécution de nombreuses migrations.

Les auteurs de Flyway ont fourni ces crochets supplémentaires pour nous permettre de contrôler la logique de rappel personnalisée au niveau de granularité le plus élevé utilisé par Flyway, à savoir la migration individuelle.

4. Les dépendances

Pour voir comment les rappels fonctionnent dans la pratique, examinons un exemple simple. Nous pouvons commencer avec notre exemple en déclarant flyway-core comme une dépendance dans nospom.xml:


    org.flywaydb
    flyway-core
    5.0.2

Nous pouvons trouver les dernières versions deflyway-core surMaven Central.

5. Rappels

Flyway nous permet de créer des callbacks en utilisant deux approches différentes, Java ou SQL. Le premier est le plus flexible. Cela nous donne la liberté d'exécuter du code arbitraire.

Ce dernier nous permet d’interagir directement avec la base de données.

5.1. Rappels Java

The Java API contract is defined in the FlywayCallback interface. Pour plus de commodité, unBaseFlywayCallback est fourni qui par défaut est une implémentation sans opération pour chaque méthode.

Dans le cas le plus simple, l'implémentation d'un callback implique d'étendreBaseFlywayCallback et de redéfinir la ou les méthodes souhaitées comme dans nosExampleFlywayCallback:

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. Rappels SQL

The SQL callback contract is defined by using files with specific names contained in directories that are configured as locations(s). Flyway recherchera dans seslocations(s) configurés les fichiers de rappel SQL et les exécutera en conséquence.

Par exemple, un fichier nommébeforeEachMigrate.sql dans un répertoire configuré en tant quelocation s'exécuterait avant chaque script de migration lors de l'exécution de la commandemigrate.

6. Configuration et exécution

Dans l'exemple suivant, nous configurons notre rappel Java et spécifions deux emplacements de script SQL: l'un contenant nos migrations et l'autre contenant des rappels SQL.

Il n'est pas nécessaire de configurer des emplacements séparés pour les migrations et les rappels SQL, mais nous l'avons configuré de cette manière dans notre exemple pour montrer comment ils peuvent être séparés:

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

Si nous définissons unbeforeEachMigrate à la fois en Java et en SQL, il est utile de savoir que le rappel Java sera exécuté en premier et immédiatement suivi de l’exécution du rappel SQL.

Ceci peut être vu dans les résultats du test ci-dessus:

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

Dans cet article, nous avons examiné comment le mécanisme de rappel Flyway peut être utilisé à la fois en Java et en SQL. Nous avons examiné des cas d'utilisation possibles et détaillé un exemple.

Comme toujours, tout le code source peut être trouvéover on GitHub.