跨多个目录迁移版本
Posted
技术标签:
【中文标题】跨多个目录迁移版本【英文标题】:Migration versions across multiple directories 【发布时间】:2013-01-16 05:48:16 【问题描述】:如果我想在多个目录中组织我的迁移(假设我正在使用 SQL 迁移,并且在“sql”目录下我有一个“主”目录,然后是一个“特殊”目录)。
所以在 sql/main 下我有 "V1.1__some_change" 等。
然后我也想将其他迁移放在 sql/special 下。但是迁移版本号必须在所有目录中不同,例如,我不能将“V1.1__some_other_change”放在 sql/special 中,因为它会导致冲突。
但是跨多个不同目录管理线性版本号并不容易。有没有解决这个问题的好方法?
希望这个问题很清楚。
【问题讨论】:
【参考方案1】:这一切都取决于为什么 special 是 “特殊” 以及它如何与“main”相关。
如果它们具有相同的生命周期,您可以使用不同的编号方案(主版本中的整数,特殊版本中的点版本)或在共享资源(白板、维基页面、 ...) 以便于知道下一个可用的是哪个。
如果它们有单独的生命周期,您可以使用单独的 Flyway 实例跟踪它们(每个实例都有不同的 flyway.table)。
【讨论】:
谢谢。它们确实具有相同的生命周期。使用“main”和“special”实际上是一个不好的例子。您对特殊点发布的想法可能会奏效,但所有目录实际上都具有相同的“重要性”。出于组织目的,它们只是按主题划分。现在,我决定只使用完整的日期/时间戳作为版本号,以便或多或少保证它们是唯一的,并保持所有目录的迁移顺序。【参考方案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");
我了解到这两种方法将在 flyway 3 中被弃用,所以也许这也可以解决我们的问题。
【讨论】:
这些方法很麻烦,在单片机中已经没有了。这应该在 2.1 中再次按预期工作以上是关于跨多个目录迁移版本的主要内容,如果未能解决你的问题,请参考以下文章