2017-03-27 92 views
1

在具有我们想用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被忽略,迁徙路线与V1_account.sql开始,也许是因为它在某种程度上仍然认为数据库已基线?

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

回答

1

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

关于你在baseline上的观察,这些是预期的性状。 account的迁移从v1开始,因为baseline=0,baselineOnMigrate=true与非空目标模式的组合(因为catalog已填充它),因此Flyway已确定这是与基线相等的预先存在的数据库 - 因此从v1开始。

+0

这种行为让我很困惑,我会看到文档被相应更新。 – user3001