迁移前的 Flyway 回调

Flyway Callback before Migration

我有一个 flyway 项目,我想在 运行 对数据库进行迁移之前 运行 一个 java 回调来更改某些 sql 文件的名称.不幸的是,正在发生的事情是迁移 运行 首先针对数据库,然后触发回调以更改文件名。

这是我的回电 class:

public class FooCallback extends BaseFlywayCallback {
    @Override
    public void beforeMigrate(final Connection connection) {
        //rename file from V_1_FooScript.sql to V_05172018_FooScript.sql
    }
}

但在 schema_version table 中我看到以下条目:

description   type    script                checksum
FooScript     SQL     V_1__FooScript.sql    1473655428

应该是

description   type    script                      checksum
FooScript     SQL     V_05172018_FooScript.sql    1473655428

如何在运行迁移之前让 flyway 更改文件名?

编辑 1: 所以看起来 flyway 正在 运行ning 迁移,然后执行回调以更改文件名,然后 运行ning文件名更改后再次迁移,但第二次尝试 运行 时失败,因为脚本正在创建 table,所以当它第二次 运行 时,它只是说 "Foo table already exists" .

正如其他人评论的那样,您的问题并不完全清楚。因为 flyway 递归地发现架构的更改,所以在回调中更改文件名会导致第二次迁移。我怀疑您的历史记录会告诉您第一次迁移是在 运行 之前准备的,第二次迁移是在您的 运行 期间准备的,然后两者都已执行。

您似乎运行正在使用旧版本的 Flyway,并且您正在尝试使用特定版本号初始化架构。如果是这种情况,您可以避免回调并通过配置文件执行此操作 documented:

flyway.sqlMigrationPrefix 版本化 SQL 迁移的文件名前缀(默认值:V) 版本化 SQL 迁移具有以下文件名结构: prefixVERSIONseparatorDESCRIPTIONsuffix ,使用默认值转换为 V1_1__My_description.sql

请注意,您在 "FooScript.sql" 之前有一个下划线字符。为此,您还需要更改 default sqlMigrationSeparator