Рубрики
Без рубрики

Руководство по обратным вызовам Flyway

Руководство по реализации обратных вызовов команд SQL и Java в Flyway

Автор оригинала: Chris Oberle.

1. введение

Библиотека Flyway позволяет нам версировать базы данных, отслеживая изменения, хранящиеся в исходном коде SQL. Каждый набор изменений называется миграцией .

Отдельные миграции применяются к базе данных последовательно с помощью набора команд, которые включают migrate , clean, info, validate, /baseline и repair . Они применяются контролируемым образом в соответствии с текущей версией целевой базы данных.

Хотя миграций обычно достаточно для покрытия большинства случаев использования, существует ряд сценариев, которые хорошо подходят для обратных вызовов.

В этой статье мы будем использовать обратные вызовы Flyway для подключения к жизненному циклу различных команд, которые он предоставляет.

2. Сценарии использования

У нас может быть очень специфическое требование, которое требует гибкости, обеспечиваемой обратными вызовами. Вот несколько возможных вариантов использования:

  • Перестройка материализованных представлений – мы можем захотеть перестроить материализованные представления всякий раз, когда мы применяем миграции, влияющие на базовые таблицы этих представлений. Обратные вызовы SQL хорошо подходят для выполнения этого типа логики
  • Очистка кэша – возможно, у нас есть миграция, которая изменяет данные, которые случайно кэшируются. Мы можем использовать обратные вызовы, чтобы очистить кэш убедиться, что наше приложение извлекает свежие данные из базы данных
  • Вызов внешней системы – используя обратные вызовы, мы можем вызвать внешнюю систему используя произвольную технологию. Например, мы можем опубликовать событие, отправить электронное письмо или запустить перезапуск сервера

3. Поддерживаемые Обратные Вызовы

Существует соответствующий до и после обратного вызова для каждой из доступных команд Flyway. Для получения дополнительной информации об этих командах обратитесь к нашей основной статье Flyway или к официальной документации .

Имя каждого обратного вызова состоит из до или после , за которым следует имя команды .

Например, обратные вызовы для команды clean являются перед Clean и после Clean . Обратные вызовы выполняются непосредственно до и после выполнения.

Вспоминая то, что мы обсуждали во введении, эти команды: migrate , clean, info, validate, | baseline и repair .

В дополнение к обратным вызовам до и после для каждой команды есть 2 дополнительных обратных вызова, доступных для команды migrate . Эти обратные вызовы называются перед каждой миграцией и после каждой миграции .

Команда migrate содержит эти дополнительные обратные вызовы, поскольку часто выполнение команды migrate приводит к выполнению многих миграций.

Авторы Flyway предоставили эти дополнительные крючки, чтобы дать нам контроль над пользовательской логикой обратного вызова на самом высоком уровне детализации, с которым работает Flyway, то есть над индивидуальной миграцией.

4. Зависимости

Чтобы увидеть, как обратные вызовы работают на практике, давайте рассмотрим простой пример. Мы можем начать с нашего примера, объявив flyway-core в качестве зависимости в вашем pom.xml :


    org.flywaydb
    flyway-core
    5.0.2

Мы можем найти последние версии flyway-core на Maven Central .

5. Обратные вызовы

Flyway позволяет нам создавать обратные вызовы, используя два разных подхода: Java или SQL. Первый из них является наиболее гибким. Это дает нам свободу выполнять произвольный код.

Последнее позволяет нам напрямую взаимодействовать с базой данных.

5.1. Обратные вызовы Java

Контракт Java API определен в интерфейсе FlywayCallback . Для удобства предоставляется Базовый FlywayCallback , по умолчанию для каждого метода используется реализация no-op.

В простейшем случае реализация обратного вызова включает в себя расширение Base FlywayCallback и переопределение нужного метода(методов), как в нашем 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(s) . Flyway будет искать в своих настроенных locations(s) для файлов обратного вызова SQL и выполнять их соответствующим образом.

Например, файл с именем перед каждой миграцией.sql в каталоге, настроенном как location , будет запускаться перед каждым сценарием миграции во время выполнения команды migrate .

6. Настройка и выполнение

В следующем примере мы настраиваем наш обратный вызов Java и указываем два расположения сценариев SQL: одно, содержащее наши миграции, и другое, содержащее обратные вызовы 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, полезно знать, что сначала будет выполнен обратный вызов 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. Мы рассмотрели возможные варианты использования и подробно привели пример.

Как всегда, весь исходный код можно найти на GitHub .