跨多个目录的迁移版本

时间:2013-02-01 00:01:09

标签: migration version flyway

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

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

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

但是,在许多不同的目录中管理线性版本号并不容易。有没有一个很好的方法来解决这个问题?

希望这个问题很明确。

2 个答案:

答案 0 :(得分:3)

这一切都取决于为什么特殊是“特殊”以及如何与“主要”相关

如果他们具有相同的生命周期,您可以使用不同的编号方案(main中的整数,特殊的点发布)或跟踪共享资源中指定的迁移编号(白板,Wiki页面, ...)让人们很容易知道下一个可用的是哪个。

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

答案 1 :(得分:2)

今天我遇到了同样的问题。我将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");

我读到这两个方法将在第3道路中弃用,所以也许这也可以解决我们的问题。