今天我遇到了同样的问题。我将 Flyway 1.7 更新为最新版本 2.0.3。我注意到迁移不再像在 1.7 版中那样工作了。
我们使用基本文件夹 (db.migrations) 的不同子文件夹来保存不同数据库方案的迁移,这些数据库方案具有独立的生命周期和自己的 schema_version 表:
src->main->resources->db.migrations
->business_partitions
-> V1_1__BUSINESS_PARTITION_INDEXES.sql
-> V1__BUSINESS_PARTITIOS.sql
->tech
-> V1_1__TECH_CERTIFICATES_AND_DECRYPTORS_TABLES.sql
-> V1__TECH.sql
-> V2__JMS.sql
->view
-> V1__PARTITION11_DB_CREATION_SCRIPT_VIEWS.sql
当我们今天使用 Java 中的以下行执行数据库迁移时:
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setLocations("db.migrations.business_partitions");
flyway.migrate();
没有进行任何迁移。
我深入研究了 flyway 源代码,发现问题是在 CompositeMigrationResolver 类的 mergeLocations() 方法中过滤掉了位置。
在那里,我的位置被过滤掉了,因为 business_partitions 是 db.migrations 的子文件夹,是 BaseDir 和 BasePackage 的默认值。
我通过明确设置 BaseDir 和 BasePackage 来解决:
flyway.setBaseDir("db.migrations.business_partitions");
flyway.setBasePackage("db.migrations.business_partitions");
我读到这两种方法将在 flyway 3 中被弃用,所以也许这也能解决我们的问题。