Настройка Flyway 'baselineOnMigrate' и 'baselineVersion' с помощью файла свойств весенней загрузки
FlywayProperties.java в Spring Boot поддерживает многие настройки Flyway, но не "baselineVersion" или "baselineOnMigrate". Я конвертирую существующее приложение в Flyway, и эти настройки, похоже, предназначены для этой цели. Наше производственное окружение строго контролируется, и запускать его в командной строке, чтобы достичь этого, нецелесообразно.
Является ли создание собственного Flyway @Bean единственным вариантом здесь?
7 ответов
You can set any of flyways properties be prefixing them with flyway
в вашем application.yml/.properties
,
It is made possible by org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway
which is annotated with @ConfigurationProperties(prefix = "flyway")
,
Если вы используете application.yml
добавить следующее:
flyway:
baselineOnMigrate: true
If using an application.properties
добавить следующее:
flyway.baselineOnMigrate = true
Это невозможно. Сегодня я потратил некоторое время на анализ кода Spring Boot, чтобы попытаться найти решение этой проблемы. Нет ничего о настройке любого из этих свойств в FlywayAutoConfiguration. Также я обнаружил, что Spring никогда не вызывает метод configure для объекта Flyway, что было бы единственным вариантом для работы flyway.properties. Spring немного злоупотребляет flyway.properties, и вместо того, чтобы передавать этот файл в Flyway, они сами используют его в качестве источника свойств. Вот почему набор возможных опций при использовании FlywayAutoConfiguration настолько ограничен. Поэтому использование FlywayAutoConfiguration не является хорошим вариантом, если вам нужны более продвинутые функции Flyway. Но использование @Bean здесь не трагедия. Ниже вы можете увидеть пример использования @Bean таким образом, что реализация этого поведения была бы невозможна с любыми файлами свойств:
@Profile(value = "!dbClean")
@Bean(name = "flyway", initMethod = "migrate")
public Flyway flywayNotADestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setBaselineOnMigrate(true);
return flyway;
}
@Profile(value = "dbClean")
@Bean(name = "flyway", initMethod = "migrate")
public Flyway flywayTheDestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setBaselineOnMigrate(true);
flyway.clean();
return flyway;
}
Как вы можете видеть, у меня есть два профиля Spring здесь. Один по умолчанию, который не будет очищать вашу базу данных, и один с полной очисткой базы данных. Очень кстати.
Я имел успех, используя FlywayMigrationStrategy.
@Component
public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy {
@Override
public void migrate(Flyway flyway) {
flyway.setBaselineOnMigrate(true);
flyway.migrate();
}
}
Вы можете использовать на application.properties
файл, но вам нужно добавить spring.
Префикс к нему для Springboot 2, такой как @pdem, отмечен в этом ответе комментариями /questions/840624/nastrojka-flyway-baselineonmigrate-i-baselineversion-s-pomoschyu-fajla-svojstv-vesennej-zagruzki/840640#840640.
spring.flyway.baseline-на-Migrate= верно
Я использую пролет 5.1.4
, для меня, добавив их в application.properties
работал
flyway.enabled = true
flyway.baseline-on-migrate = true
После того, как вы покопались в источнике и выполнили несколько экспериментов, может показаться, что, поскольку setBaselineVersion() перегружен в классе Flyway, Spring не может ввести значение свойства.
Изменение на flyway.baselineVersionAsString = 2 работает как нужно.
Ответ Сета работает на меня. Но я изменил
flyway.setBaselineOnMigrate(true);
для
flyway.baseline();