flyway4, повторяемая миграция, динамическое изменение контрольной суммы, maven, всегда выполняется
У меня есть повторяющийся сценарий миграции flyway sql, который я хочу запускать каждый раз при вызове flyway: вызывается migrate.
R__Always_Executed.sql:
/* Version: ${timestamp} <- changes on each execution */
...
Я определяю заполнитель timestamp
в pom.xml:
<properties>
<flyway.placeholders.timestamp>${maven.build.timestamp}</flyway.placeholders.timestamp>
</properties>
Каждый раз, когда я делаю
mvn clean install flyway:migrate
метка времени изменяется, поэтому содержимое файла и его контрольная сумма должны быть разными. Следовательно, скрипт должен быть выполнен. Это не так, однако.
У кого-нибудь есть идеи, почему flyway не учитывает замены заполнителей при расчете контрольной суммы?
3 ответа
Flyway вычисляет контрольную сумму миграции до замены заполнителей фактическими значениями. Это означает ${timestamp}
не сделаю трюк.
Вместо повторяющихся миграций вы можете использовать механизм обратного вызова Flyway. Создайте файл SQL с именем afterMigrate.sql
и поместите его в тот же каталог, что и ваши миграции. Будет выполняться каждый раз flyway:migrate
называется. Он запускается после выполнения всех миграций - если вам нужно запустить его до миграции, используйте beforeMigrate.sql
,
Это потому, что местоположение по умолчанию, сканируемое в 4.x
filesystem:src/main/resources/db/migration
Оформить заказ Improved compatibility with schema-first persistence frameworks
раздел в заметках о выпуске. а также locations
запись в плагине Maven о переносе документации.
Вся ваша конфигурация отсутствует, поэтому трудно сказать, что не так. Вы пытались добавить timestamp
тег в <placeholders>
раздел вместо версии на основе свойств? См. Документацию по миграции подключаемого модуля Maven для примера конфигурации заполнителей. например
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>4.0.3</version>
<configuration>
<!-- ... -->
<placeholders>
<timestamp>${maven.build.timestamp}</timestamp>
</placeholders>
</configuration>
</plugin>
Хорошо, так что я нашел обходной путь. Если я изменю местоположение на целевую папку, flyway будет выполнять повторяемую миграцию каждый раз, когда вызывается mvn flyway: migrate:
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>4.0.3</version>
<configuration>
<!-- ... -->
<locations>
<location>filesystem:target/classes/db/migration</location>
</locations>
</configuration>
</plugin>
Кстати, я проверил свою целевую папку. Maven НЕ заменяет ничего в файле R__Always_Executed.sql. Это все еще выглядит так
/* Version: ${timestamp} <- changes on each execution */
...
Может быть, ошибка в flyway, что она не заменяет переменные для вычисления контрольной суммы, если файлы находятся в папке src? Надеюсь, Аксель сможет это прокомментировать.