Flyway:Java迁移的前缀

问题描述 投票:1回答:1

我有一个带有SQL + Java迁移的复合JAR。为了向后兼容,我必须区分新安装和更新。我使用前缀“I”(新安装)和“V”(更新):

configuration.sqlMigrationPrefix("I");

这适用于SQL迁移,但对于Java迁移类I1_1__test.class,我收到错误:

org.flywaydb.core.api.FlywayException:无效的JDBC迁移类名:db.migration.test.I1_1__test =>确保它以V或R开头,或者实现org.flywaydb.core.api.migration.MigrationInfoProvider for default-default命名

documentation中,提到了实现我自己的MigrationResolver和自定义MigrationExecutor的可能性。

问题是,我仍然需要保持SqlMigrationResolver活跃,我发现因为这个而几乎从头开始重新实现这两种策略(SQL和Java)非常累人。

有更好更简单的方法吗?

PS:这个功能有an old pull request,遗憾的是没有合并。

java flyway
1个回答
1
投票

一种方法是,如何在不进行任何编码的情况下实现此目的,将不同类型的迁移放在不同的类路径位置:

src/main/
    /java/
        /my/comp/db/migration/
            /install/
                V1_1__Test1.java
            /update/
                V1_2__Test2.java 
    /resources/
        /my/comp/db/migration/
            /install/
                V1.1__Test1.sql
            /update/
                V1.2__Test2.sql

然后设置配置:

Configuration config = Flyway.configure();
...

if (isInstall())  {
    config.locations("classpath:my/comp/db/migration/install");
} else {
    config.locations("classpath:my/comp/db/migration/update");
}

为了保持一致,我建议以相同的方式处理SQL和Java迁移,但您也可以保留基于前缀的控件:

...
src/main/resources/my/comp/db/migration/sql/
    I1.1__Test1.sql
    V1.2__Test2.sql

...
if (isInstall())  {
    config.locations(
        "classpath:my/comp/db/migration/sql",
        "classpath:my/comp/db/migration/install");
    config.sqlMigrationPrefix("I");
} else {
    config.locations(
        "classpath:my/comp/db/migration/sql",
        "classpath:my/comp/db/migration/update");
    //config.sqlMigrationPrefix("V"); -- this is default
}
© www.soinside.com 2019 - 2024. All rights reserved.