代码之家  ›  专栏  ›  技术社区  ›  Richard

迁移前的Flyway回调

  •  4
  • Richard  · 技术社区  · 6 年前

    我有一个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 表I见以下条目:

    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 回复  |  直到 6 年前
        1
  •  1
  •   OptimalChoice    6 年前

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

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

    飞行路线。sqlMigrationPrefix 版本化SQL迁移的文件名前缀(默认值:V) 版本化的SQL迁移具有以下文件名结构:prefixVERSIONseparatorDESCRIPTIONsuffix,使用默认值将其转换为V1\u 1\uu My\u描述。sql

    请注意,“FooScript.sql”前面有一个下划线字符。要实现这一点,您需要更改 default sqlMigrationSeparator