【问题标题】:Flyway: non-empty schema without metadata tableFlyway:没有元数据表的非空模式
【发布时间】:2014-10-23 02:26:34
【问题描述】:

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

关于如何在这种情况下运行迁移有什么想法吗?

【问题讨论】:

  • 我进一步更改了问题的标题,以简单地说明错误消息。原始标题“迁移原始数据库导致错误”根本不正确,如下面的 cmets 所述。

标签: flyway


【解决方案1】:

标题有些矛盾,因为数据库确实不是原始的,因为您通过 PostGIS 扩展安装了公共架构中的许多对象。

你可以

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

【讨论】:

  • 公平点,更改标题和内容以反映警告。再次感谢 Axel 的回答,将在周一再次点击并返回我的结果。
  • 顺便说一句,如果您在this Flyway / EJB integration question 上有任何 cmets,我很想听听您的任何 cmets。
  • 我所做的是将flyway 添加到flyway.schemas 所以schema_version 是完全隔离的。目前我们有大约 7 个模式,所以在 reference to your answer on my previous question 我将采用“无”的方法。使用此设置,迁移原始* 数据库即可。然而,在现有数据库上,init -initVersion=2 将按需要工作,但migrate -initOnMigrate=true -initVersion=2 将尝试运行所有迁移。这似乎与文档相矛盾。
  • 我添加了一个关于initOnMigrateissue on github,并且还在 cmets 部分提供了一个正在进行的补丁以供进一步讨论。
  • 使用 JPA,您可以通过“schema”属性告诉您的实体有关新模式的信息。例如@Table(name = "posts", schema = "blog").
【解决方案2】:

如果你使用 Gradle,你可以运行

./gradlew -Dflyway.schemas=public flywayClean flywayMigrate

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

小心!

这将删除public 架构中的所有数据

【讨论】:

    【解决方案3】:

    我认为此错误仅出现在最新版本的 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;
    
        }
    
    }
    

    【讨论】:

      【解决方案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();
      

      我告诉你我来自 flyway.org 的参考资料的 URL Flyway.org/documentation/commandline/baseline

      【讨论】:

        【解决方案5】:

        在我的情况下,当我删除表 myschema.schema_version 中的所有行时,问题就开始了

        ./gradlew flywayInit 成功了,错误不再显示。

        【讨论】:

          猜你喜欢
          • 2019-06-29
          • 1970-01-01
          • 2019-04-09
          • 2017-08-23
          • 2022-01-24
          • 2016-07-24
          • 2018-12-12
          • 2017-09-04
          • 2022-01-15
          相关资源
          最近更新 更多