【发布时间】:2017-08-20 04:57:26
【问题描述】:
在具有自定义数据库迁移器的应用程序中,我们希望将其替换为 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 被忽略,Flyway 以 V1_account.sql 开头,可能是因为它仍然认为数据库已经基线化?
有人有解决问题的建议吗?
【问题讨论】:
标签: java database-migration flyway