У меня есть проект пролетного пути, в котором я хочу запустить обратный вызов java, чтобы изменить имя определенных файлов sql перед запуском миграции для базы данных. К сожалению, происходит то, что миграция сначала выполняется в базе данных, а затем срабатывает обратный вызов, чтобы изменить имя файла.
Вот мой класс обратного вызова:
public class FooCallback extends BaseFlywayCallback {
@Override
public void beforeMigrate(final Connection connection) {
//rename file from V_1_FooScript.sql to V_05172018_FooScript.sql
}
}
Но в таблице schema_version я вижу такую запись:
description type script checksum
FooScript SQL V_1__FooScript.sql 1473655428
Следует сказать
description type script checksum
FooScript SQL V_05172018_FooScript.sql 1473655428
Как мне заставить пролетный путь изменить имя файла перед, запускающего миграцию?
Редактировать 1: Таким образом, похоже, что пролетный путь выполняет миграцию, затем выполняет обратный вызов, чтобы изменить имя файла, затем снова запускает миграцию, так как имя файла изменилось, но не работает при попытке запустить второй раз, потому что скрипт создает таблицу, поэтому, когда он запускается второй раз, когда он просто говорит: «Таблица Foo уже существует».
Какой здесь вариант использования? Как запустить миграцию? Почему бы не выполнить код для переименования перед самой миграцией?
Стоит отметить, что BaseFlywayCallback не рекомендуется в текущей версии Flyway - теперь вместо него нужно реализовать Перезвоните.
Обратите внимание, что если вы пытаетесь использовать эту функцию для динамического изменения имен, это испортит бессилие пролетного пути, поскольку он обнаружит новые файлы изменений как новые файлы. Это может привести к тому, что он будет работать в другом порядке в разных средах ...




Как отмечали другие, ваш вопрос не совсем ясен. Поскольку пролетный путь рекурсивно обнаруживает изменения в схеме, изменение имени файла в обратном вызове вызывает вторую миграцию. Я подозреваю, что ваша история покажет вам, что первая миграция была подготовлена перед запуском, вторая миграция была подготовлена во время вашего запуска, а затем оба были выполнены.
Похоже, что вы используете более старую версию Flyway и пытаетесь инициализировать схему с определенным номером версии. Если это так, вы можете избежать обратного вызова и выполнить это через файл конфигурации как задокументировано:
flyway.sqlMigrationPrefix Префикс имени файла для версий SQL-миграций (по умолчанию: V) Миграции SQL с поддержкой версий имеют следующую структуру имен файлов: prefixVERSIONseparatorDESCRIPTIONsuffix, который при использовании значений по умолчанию преобразуется в V1_1__My_description.sql.
Обратите внимание, что у вас есть один символ подчеркивания перед "FooScript.sql". Для этого вам также необходимо изменить по умолчанию sqlMigrationSeparator.
Почему бы не сделать переименование при запуске?