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? Надеюсь, Аксель сможет это прокомментировать.

Другие вопросы по тегам