迁移前的 Flyway 回调

Posted

技术标签:

【中文标题】迁移前的 Flyway 回调【英文标题】:Flyway Callback before Migration 【发布时间】:2018-10-28 08:11:16 【问题描述】:

我有一个 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 表已经存在”。

【问题讨论】:

为什么不开始重命名呢? 这里的用例是什么?您如何运行迁移?为什么不在迁移之前执行代码重命名? 值得注意的是,BaseFlywayCallback 在当前版本的 Flyway 中已弃用 - 现在需要实现 Callback。 请注意,如果您尝试使用此功能来动态更改名称,它将破坏 flyway 的无能,因为它会将新更改的文件检测为新文件。这可能会导致它在不同的环境中以不同的顺序运行... 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于迁移前的 Flyway 回调的主要内容,如果未能解决你的问题,请参考以下文章

Flyway迁移无法识别beforeValidate.sql

Flyway 可重复迁移 - 在版本化迁移之前执行?

Flyway 迁移无法识别 beforeValidate.sql

在命令行中执行 flyway 回调

flyway 4.0 java基础回调afterValidate没有抓住钩子

如何创建脚本或 Flyway 可以配置为每次使用 SQL 回调调用它?