Flyway:校验和和可重复的Java迁移

时间:2017-06-23 07:48:30

标签: flyway

我遇到了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:信息被执行,它显示过时的迁移,因为所有触发器都存在且新的校验和为零。所以我必须做一个" flyway:repair"或者另外一个" flyway:migrate"得到一张干净的桌子" schema_version"。

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

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

实现自己的MigrationResolver和自定义的MigrationExecutor似乎太重了。

1 个答案:

答案 0 :(得分:0)

校验和的定义是错误的。校验和应该引用当前的目标状态。

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