2017-06-23 110 views
0

我在Flyway 4.2.0中有可重复的Java迁移问题。Flyway:校验和和可重复的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被执行时,它会显示过期的迁移,因为所有触发器都存在,并且新的校验和为零。所以我必须做一个“飞行道路:修复”或额外的“飞行道路:迁移”来获得一个干净的表格“schema_version”。

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

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

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

回答

0

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

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