【问题标题】:Flyway: checksums and repeatable Java migrationsFlyway:校验和和可重复的 Java 迁移
【发布时间】:2017-11-26 16:57:32
【问题描述】:

我在 Flyway 4.2.0 中遇到可重复 Java 迁移的问题。

例如,我编写了一个可重复的 Java 迁移,它为每个具有特定列的表创建一个触发器。此迁移的 ChecksumProvider 计算缺少触发器的表的串联名称的哈希码。

    @Override
    public int getChecksum(Connection conn) throws SQLException {
        return queryTableNames(conn).stream().collect(Collectors.joining(",")).hashCode();
    }
  • 当表列表为空时,哈希码为零,不应该做任何事情。

  • 当表列表不为空时,哈希码不为零(将其命名为 xxx),并且为每个表添加一个合适的触发器到数据库中。 在这种情况下,hascode xxx 被写入“schema_version”。 下次执行 flyway:info 时,它显示了一个过时的迁移,因为所有触发器都存在并且新的校验和为零。所以我必须做一个“flyway:repair”或一个额外的“flyway:migrate”来获得一个干净的表“schema_version”。

在 Java 可重复迁移后是否有简单的机会自动更新校验和?

我检查了 FlywayCallback.afterEachMigrate,但只有对 MigrationInfo 的只读访问权限。使用这种方法的进一步步骤将使用过多的飞行路径内部(即单独更新“schema_version”)。

实现一个自己的 MigrationResolver 加上一个自定义的 MigrationExecutor 似乎太重了。

【问题讨论】:

    标签: flyway


    【解决方案1】:

    校验和的定义是错误的。校验和应参考当前目标状态。

    在示例中,方法 queryTableNames() 应返回具有此类触发器的所有表,并且迁移应使用所需触发器完成这些表。

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 2019-12-09
      • 2017-08-13
      • 2015-05-16
      • 2016-04-13
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2015-01-02
      相关资源
      最近更新 更多