将创建和迁移脚本与Flyway混合

时间:2016-11-13 05:00:58

标签: flyway

可以使用Flyway混合创建和迁移脚本,以便:

  • 新安装运行架构创建脚本
  • 现有安装运行迁移脚本,永远不会看到后续版本的创建脚本

E.g。给出:

db/create/V1/V1__schema.sql
db/create/V2/V2__schema.sql
db/create/V3/V3__schema.sql
db/migration/V1/V1.1__migrateA.sql
db/migration/V2/V2.1__migrateB.sql
db/migration/V2/V2.2__migrateC.sql

现有的V1安装将运行以下内容以进入V3:

  • 分贝/迁移/ V1 / V1.1__migrateA.sql
  • 分贝/迁移/ V2 / V2.1__migrateB.sql
  • 分贝/迁移/ V2 / V2.2__migrateC.sql

它永远不会运行以下内容,因为它们代表mysqldump生成的仅模式SQL:

  • 分贝/创建/ V2 / V2__schema.sql
  • 分贝/创建/ V3 / V3__schema.sql

将运行新的V3安装:

  • 分贝/创建/ V3 / V3__schema.sql

上述内容与Upgrade scenario when using Flyway建议的方法存在冲突,但需要填充数据,而与迁移无关。

看起来应该可以使用flyway.locations来支持这一点,但是安装总是需要包含创建脚本的路径,以便Flyway可以看到它。

另一种选择似乎是在Flyway之外运行创建脚本并设置基线,但如果Flyway可以管理所有内容,那将是很好的。

1 个答案:

答案 0 :(得分:0)

最后,我开发了一个工具来做到这一点。 该工具具有最新的架构:

db/schema/schema.sql

和迁移脚本:

db/migration/<version>/<version>.<sequence>__<JIRA issue>.sql

e.g:

db/migration/V1/V1.1__JIRA-15.sql    
db/migration/V2/V2.1__JIRA-12.sql
db/migration/V2/V2.2__JIRA-22.sql
db/migration/V3/V3.0__JIRA-34.sql

如果数据库没有表格,则执行schema.sql,然后使用最新版本对flyway进行基线化处理,如Flyway所报告的那样      MigrationInfoService.pending()方法。

即。 pending()返回的最后一个MigrationInfo元素确定在调用 Flway.baseline()之前传递给 Flyway.setBaselineVersion()的版本 e.g:

DbSupport support = DbSupportFactory.createDbSupport(connection, true);
Schema schema = support.getOriginalSchema();
if (schema.allTables().length == 0) {
  Resource resource = new ClassPathResource("db/schema/schema.sql", getClass().getClassLoader());
  SqlScript script = new SqlScript(resource.loadAsString("UTF-8"), support);
  script.execute(support.getJdbcTemplate());
  MigrationInfo[] pending = flyway.info().pending();
  MigrationInfo version = pending.length > 0 ? pending[pending.length - 1] : null;
  if (version != null) {
    flyway.setBaselineVersion(version.getVersion());
    flyway.setBaselineDescription(version.getDecription());
    flyway.baseline();
  }
}

这确保不会为新创建的数据库调用任何迁移脚本,但这意味着schema.sql必须已包含所有更改。

如果数据库有表格,但没有Flyway信息,则根据检测到的架构版本对其进行基线化。