Found non-empty schema "public" without metadata table! Use init() or set initOnMigrate to true to initialize the metadata table.
public
appelé spatial_ref_sys
.Lorsque je lance flyway migrate
sur cette base de données, j'obtiens l'erreur ci-dessus. Exécuter init
semble créer la table public.schema_version
et marquer la version 1 comme SUCCEDED sans exécuter le fichier de migration. J'ai également essayé des combinaisons de initOnMigrate
sans succès. Flyway n'est pas configuré pour gérer les schémas.
Des idées sur la façon dont je peux exécuter une migration dans ce scénario?
Le titre est quelque peu contradictoire, car la base de données n'est en effet pas vierge puisque vous avez installé, via l'extension PostGIS, un certain nombre d'objets dans le schéma public.
Tu peux soit
flyway.schemas
sur un nouveau schéma, par exemple my_app, qui sera ensuite créé automatiquement par Flyway. Votre application devrait alors utiliser celle-ci au lieu de public (recommandé)flyway.baselineOnMigrate
sur true
ou appelez flyway.baseline()
par rapport au schéma public. Cela fonctionnera, mais public contiendra alors un mélange de vos objets d’application et des objets PostGIS.Si vous utilisez Gradle, vous pouvez exécuter
./gradlew -Dflyway.schemas=public flywayClean flywayMigrate
Où public est le nom de la base de données contenant la table schema_versions. Cela devrait supprimer la table et les métadonnées ainsi que l'exécution des migrations pour la remettre à jour.
Je pense que cette erreur ne concerne que la dernière version de Flyway, c'est-à-dire au-dessus de 4.03. Je ne l'avais pas reçu dans le projet précédent, mais je l'ai obtenu lorsque j'utilise la version 5.07 de Flyway dans mon dernier projet. Mettre le code ici qui résout mes problèmes
public class FlywayConfig {
@Autowired
DataSource dataSource;
@Autowired
Config config;
@Bean
public Flyway flyway(){
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setSqlMigrationPrefix("V");
flyway.setLocations(new String[] { config.getSqlLocation() });
flyway.setBaselineOnMigrate(true);
// *******************flyway.clean(); ********************// this will wipe out the DB, be careful
flyway.migrate();
return flyway;
}
}