【问题标题】:Flyway partial migration of legacy application遗留应用程序的 Flyway 部分迁移
【发布时间】: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_versionaccount_schema_version

现在问题如下: 从一个空数据库开始,我想应用每个类别的所有预先存在的迁移,如上所述。 如果我删除_flyway.setBaselineOnMigrate(true); (1),那么catalog 迁移(第一个)会成功,但它会抱怨account 架构public 不为空。

同样设置_flyway.setBaselineOnMigrate(true); 会导致以下行为: “目录”迁移成功,但 V0_account.sql 被忽略,Flyway 以 V1_account.sql 开头,可能是因为它仍然认为数据库已经基线化?

有人有解决问题的建议吗?

【问题讨论】:

    标签: java database-migration flyway


    【解决方案1】:

    您最简单的解决方案是将schema_version 表分别保存在另一个架构中。我已经回复了very similar question here

    关于您对baseline 的观察,这些是预期的特征。 account 的迁移从 v1 开始,因为 baseline=0baselineOnMigrate=true 和非空目标模式的组合(因为 catalog 已填充它)Flyway 已确定这是一个预先存在的数据库,即等于基线 - 因此从 v1 开始。

    【讨论】:

    • 这种行为真的让我很困惑,我会看到文档相应地更新。
    猜你喜欢
    • 2014-12-09
    • 2012-03-05
    • 2022-09-23
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2020-08-20
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多