FlywayProperties.Java de Spring Boot prend en charge de nombreux paramètres Flyway mais pas 'baselineVersion' ou 'baselineOnMigrate'. Je convertis une application existante en Flyway et ces paramètres semblent être conçus à cette fin. Notre environnement de production est hautement contrôlé et exécuter une version en ligne de commande de flyway pour y parvenir n’est pas pratique.
Créer un Flyway @Bean personnalisé est-il la seule option ici?
Vous pouvez définir any of flyways properties comme préfixe flyway
dans votre application.yml/.properties
.
Ceci est rendu possible par org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway
qui est annoté avec @ConfigurationProperties(prefix = "flyway")
.
Si vous utilisez un application.yml
, ajoutez ce qui suit:
flyway:
baselineOnMigrate: true
Si vous utilisez un application.properties
, ajoutez ce qui suit:
flyway.baselineOnMigrate = true
C'est impossible. J'ai passé quelque temps aujourd'hui à analyser le code de Spring Boot pour tenter de trouver une solution à ce problème. Il n'y a rien sur la définition de ces propriétés dans FlywayAutoConfiguration. De plus, j'ai constaté que Spring n'appelle jamais la méthode configure sur l'objet Flyway, ce qui serait la seule autre option permettant à flyway.properties de fonctionner. Spring abuse un peu de flyway.properties et au lieu de fournir ce fichier à Flyway, ils l'utilisent eux-mêmes comme source de propriétés. C’est pourquoi le nombre d’options possibles lors de l’utilisation de FlywayAutoConfiguration est si limité. Donc, utiliser FlywayAutoConfiguration n'est pas une bonne option si vous avez besoin de fonctionnalités plus avancées de Flyway. Mais utiliser @Bean n’est pas une tragédie ici. Vous trouverez ci-dessous un exemple d'utilisation de @Bean de cette manière, qui impliquerait ce comportement serait impossible avec aucun fichier de propriété:
@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;
}
Comme vous pouvez le voir, j'ai deux profils Spring ici. Un défaut qui ne nettoiera pas votre base de données, et un avec le nettoyage complet de la base de données. Très utile.
J'ai eu du succès en utilisant une FlywayMigrationStrategy.
@Component
public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy {
@Override
public void migrate(Flyway flyway) {
flyway.setBaselineOnMigrate(true);
flyway.migrate();
}
}
Vous pouvez utiliser le fichier application.properties
, mais vous devez lui ajouter le préfixe spring.
pour springboot 2, comme @pdem marqué dans cette réponse. Commentaires https://stackoverflow.com/a/39244097/273119 .
spring.flyway.baseline-on-migrate = true
J'utilise flyway 5.1.4
, pour moi en ajoutant ceux-ci dans application.properties
travaillé
flyway.enabled = true
flyway.baseline-on-migrate = true
Après avoir creusé dans la source et lancé quelques expériences, il semblerait que, étant donné que la méthode setBaselineVersion () est surchargée dans la classe Flyway, Spring ne peut pas injecter la valeur de la propriété.
Passer à flyway.baselineVersionAsString = 2 fonctionne comme vous le souhaitez.