Автор оригинала: 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 .