Пролет: непустая схема без таблицы метаданных

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

  • Я использую Postgres 9.2 с Postgis 2.0. Это означает, что по умолчанию при создании новой базы данных будет создана таблица, созданная в public схеме spatial_ref_sys.

Когда я запускаю flyway migrate в этой базе данных, я получаю вышеуказанную ошибку. Выполнение init похоже, создает таблицу public.schema_version и маркирует версию 1 как SUCCEDED без фактического запуска файла миграции. Я также пробовал комбинации initOnMigrate без успеха. Flyway не настроен для управления любыми схемами.

Любые идеи о том, как я могу выполнить миграцию в этом сценарии?

Ответ 1

Название несколько противоречиво, поскольку база данных действительно не девственна, поскольку вы устанавливали через расширение PostGIS несколько объектов в общедоступной схеме.

Вы можете либо

  • установите flyway.schemas в новую схему, скажем my_app, которая затем будет автоматически создана Flyway. Затем ваше приложение должно использовать это вместо публичного (рекомендуется).
  • установите flyway.baselineOnMigrate в true или вызовите flyway.baseline() против общедоступной схемы. Это будет работать, но публикация будет содержать сочетание как ваших объектов приложения, так и объектов PostGIS.

Ответ 2

Если вы используете Gradle, вы можете запустить

./gradlew -Dflyway.schemas=public flywayClean flywayMigrate

Где public - это имя базы данных, содержащей таблицу schema_versions. Это должно удалить таблицу и метаданные, а также запустить миграцию, чтобы вернуть ее в актуальное состояние.

Внимание!

Это удалит все данные в public схеме

Ответ 3

Я думаю, что эта ошибка возникает только в последней версии Flyway, т.е. выше 4.03. Я не получил в более раннем проекте, но получил его, когда я использую версию 5.07 Flyway в моем последнем проекте. Положите код здесь, чтобы решить мои проблемы

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;

    }

}

Ответ 4

эта работа для меня, я был фигни с той же проблемой много времени

мой проект строился на Maven

Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setLocations("db/your_db");
flyway.setTable("name_of_schema");

затем добавил эту строку

flyway.setBaselineOnMigrate(true);
flyway.clean();

следующие строки

 MigrationInfo migrationInfo = flyway.info().current();
 flyway.migrate();

и я предоставлю вам URL моих ссылок с flyway.org Flyway.org/documentation/commandline/baseline

Ответ 5

В pom.xml добавьте эту строку внутри своих плагинов build- >  правда