Настройка 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();
Другие вопросы по тегам