web-dev-qa-db-fra.com

Flyway: schéma non vide sans table de métadonnées

Found non-empty schema "public" without metadata table! Use init() or set initOnMigrate to true to initialize the metadata table.

  • J'utilise Postgres 9.2 avec Postgis 2.0. Cela signifie que par défaut, lorsque je crée une nouvelle base de données, une table sera créée dans le schéma 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?

22
markdsievers

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

  • définissez 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é)
  • définissez 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.
21
Axel Fontaine

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. 

2
ruby_newbie

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;

    }

}
1
Vikky