在具有我们想用Flyway替换的自定义数据库迁移器的应用程序中。传统应用程序的部分迁移迁移
这些迁移分为几类,如用于用户管理的“帐户”和用于产品目录的“目录”。 文件名为$category.migration.$version.sql
。这里,$category
是以上类别之一,并且$version
是从0开始的整数版本。
例如account.migration.23.sql
虽然有人可能会争辩说,每个类别应该是一个单独的数据库,实际上它不是,并且需要进行重大的重构来改变它。
此外,我可以使用每个类别一个模式,但这又需要重写所有SQL查询。
所以我做了以下内容:
- 移动
$category.migration.$version.sql
到/sql/$category/V$version__$category.sql
(例如account.migration.1.sql
成为/sql/account/V1_account.sql
) - 使用元数据表每个类别
- 设置基线版本为零
在代码将是
String[] _categories = new String[] { "catalog", "account" };
for (String _category : _categories) {
Flyway _flyway = new Flyway();
_flyway.setDataSource(databaseUrl.getUrl(), databaseUrl.getUser(), databaseUrl.getPassword());
_flyway.setBaselineVersion(MigrationVersion.fromVersion("0"));
_flyway.setLocations("classpath:/sql/" + applicationName);
_flyway.setTarget(MigrationVersion.fromVersion(_version + ""));
_flyway.setTable(category + "_schema_version");
_flyway.setBaselineOnMigrate(true); // (1)
_flyway.migrate();
}
所以会有元数据表catalog_schema_version
和account_schema_version
。
现在的问题如下: 从一个空的数据库开始,我想按上面的方法应用每个类别的所有预先存在的迁移。 如果我删除_flyway.setBaselineOnMigrate(true);
(1),那么catalog
迁移(第一个)成功,但它会抱怨account
模式public
不为空。
同样设置_flyway.setBaselineOnMigrate(true);
导致以下行为: 的“目录”迁移成功,但V0_account.sql
被忽略,迁徙路线与V1_account.sql
开始,也许是因为它在某种程度上仍然认为数据库已基线?
有没有人有解决问题的建议?
这种行为让我很困惑,我会看到文档被相应更新。 – user3001