我有一个带有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,遗憾的是没有合并。
一种方法是,如何在不进行任何编码的情况下实现此目的,将不同类型的迁移放在不同的类路径位置:
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
}