3

如果我想在多个目录中组织我的迁移(假设我正在使用 SQL 迁移,并且在“sql”目录下我有一个“主”目录,然后是一个“特殊”目录)。

所以在 sql/main 我有“V1.1__some_change”等。

然后我也想将其他迁移放在 sql/special 下。但是迁移版本号必须在所有目录中都不同,例如,我不能将“V1.1__some_other_change”放在 sql/special 中,因为它会导致冲突。

但是跨多个不同目录管理线性版本号并不容易。有没有解决这个问题的好方法?

希望这个问题很清楚。

4

2 回答 2

3

好吧,这一切都取决于为什么 special 是"special"以及它与 "main"的关系。

如果它们具有相同的生命周期,您可以使用不同的编号方案(主版本中的整数,特殊版本中的点版本)或在共享资源(白板、wiki 页面等)中跟踪分配的迁移编号,以便于了解下一个可用的是。

如果它们有单独的生命周期,您可以使用单独的 Flyway 实例跟踪它们(每个实例都有不同的 flyway.table)。

于 2013-02-01T07:01:09.770 回答
3

今天我遇到了同样的问题。我将 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 中被弃用,所以也许这也能解决我们的问题。

于 2013-02-21T16:37:54.570 回答