如果我想在多个目录中组织我的迁移(假设我正在使用SQL迁移,并且在“sql”目录下,我有一个“主”目录,然后是一个“特殊”目录。)
所以在sql / main下我有“V1.1__some_change”等。
然后我想将其他迁移放在sql / special下。但是迁移版本号必须在所有目录中是不同的,例如,我不能在sql / special中放置“V1.1__some_other_change”,因为它会导致冲突。
但是,在许多不同的目录中管理线性版本号并不容易。有没有一个很好的方法来解决这个问题?
希望这个问题很明确。
答案 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道路中弃用,所以也许这也可以解决我们的问题。