Found non-empty schema "public" without metadata table! Use init() or set initOnMigrate to true to initialize the metadata table.
public
模式中创建一个名为spatial_ref_sys
的表。当我在此数据库上运行flyway migrate
时,出现上述错误。运行init
似乎创建public.schema_version
表并将版本1标记为SUCCEDED而不实际运行迁移文件。我也试过initOnMigrate
的组合而没有成功。 Flyway未配置为管理任何模式。
关于如何在这种情况下运行迁移的任何想法?
答案 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