Flyway:没有元数据表的非空模式

时间:2014-08-29 05:21:56

标签: flyway

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未配置为管理任何模式。

关于如何在这种情况下运行迁移的任何想法?

4 个答案:

答案 0 :(得分:24)

标题有些矛盾,因为数据库确实不是处女,因为您通过PostGIS扩展程序安装了公共模式中的许多对象。

你可以

  • flyway.schemas设置为新架构,例如my_app,然后由Flyway自动创建。然后,您的应用程序应使用此应用程序而不是公共(推荐)
  • flyway.baselineOnMigrate设置为true或针对公共架构调用flyway.baseline()。这将起作用,但public将包含应用程序对象和PostGIS对象的混合

答案 1 :(得分:3)

如果您使用的是Gradle,则可以运行

./gradlew -Dflyway.schemas=public flywayClean flywayMigrate

其中public是包含schema_versions表的数据库的名称。这应该删除表和元数据以及运行迁移以使其恢复到最新状态。

注意!

这将删除public架构

中的所有数据

答案 2 :(得分:2)

我认为此错误仅适用于最新版本的Flyway,即4.03以上。我没有在之前的项目中收到过,但是当我在我的最新项目中使用Flyway 5.07时,我得到了它。将代码放在此处以解决我的问题

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;

    }

}

答案 3 :(得分:-1)

这对我来说很有效,我花了很多时间解决同样的问题

我的项目在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();

,我让你从flyway.org获得我的参考网址 Flyway.org/documentation/commandline/baseline