迁移前的Flyway回调

时间:2018-05-17 23:48:16

标签: java sql callback flyway

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

这是我的回调课程:

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表格中,我看到以下条目:

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正在运行迁移,然后执行回调以更改文件名,然后再次运行迁移,因为文件名已更改但在尝试运行时失败第二次,因为脚本正在创建一个表,所以当它第二次运行它只是说" Foo表已经存在"。

1 个答案:

答案 0 :(得分:1)

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

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

执行此操作

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

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