"compress" Flyway 迁移有什么方法吗?

Any way to "compress" Flyway migrations?

我们正在使用 Flyway 迁移数据库模式,我们已经有超过 100 个迁移脚本。

一旦我们 "squashed" 将多个迁移转换为单个第一版本迁移,这在开发过程中是可以的,因为我们删除并重新创建架构。但是在生产环境中这是行不通的,因为 Flyway 无法验证迁移。

我找不到关于在这种情况下该怎么做的任何文档或最佳实践。问题是文件数量不断增加,我不想每次都看到成千上万的迁移文件,基本上如果生产已经是最新版本。我的意思是,版本号低于生产版本的迁移脚本与我们无关,如果我们可以将这些文件压缩到一个迁移中,那就太棒了。

我们正在使用 MySQL。

我们该如何处理?

重基线化不就是这样吗?

我对 flyway 还是个新手,但我认为这就是它的工作方式。在相信我的话之前,请先测试以下内容。

删除 schema_version table。 删除您的迁移脚本。

运行 飞路基线 (这会重新创建 schema_version table 并添加基线记录作为版本 1)

现在你可以开始了。请记住,您将无法 'migrate' 任何以前的版本,因为您已经删除了所有迁移脚本,但这对您来说可能不是问题。

分步解决方案:

  1. drop table schema_version;
  2. 例如,通过 MySQL Workbench 将数据库结构导出为脚本。将此脚本命名为 V1__Baseline.sql
  3. 删除所有迁移脚本并将V1__Baseline.sql 添加到您的脚本文件夹,因此它是 Flyway 唯一可用的脚本
  4. 运行 Flyway 的 "baseline" 命令
  5. 完成

我们这样做是为了让我们能够压缩用于在开发环境中构建新数据库的脚本,以及针对现有生产数据库 运行 而无需登录和删除 flyway_version_history table ,我们可以保留脚本(主要供参考):

将所有脚本压缩为一个新脚本,例如V1 到 V42 变成了新的脚本 V43。 通过将 .txt 放在末尾将 V1 到 V42 转换为文本文件。

将基线设置为 43。 设置 flyway 以忽略丢失的迁移。

在脚本 V43 中使用 'if' 块来保护 create/insert 语句,这样它们就不会 运行 用于现有的生产数据库。我们使用 postgres,所以它是这样的:

DO $$
  DECLARE
    flywayVersion INTEGER;
  BEGIN

    SELECT coalesce(max(installed_rank), 0) INTO flywayVersion FROM flyway_schema_history;
    RAISE NOTICE 'flywayVersion = %', flywayVersion;
    IF flywayVersion = 0 THEN
      RAISE NOTICE 'Creating the DB from scratch';
      CREATE TABLE...
      .....
    END IF;
END$$;

flyway 命令看起来像这样:

Flyway.configure()
      .dataSource(...)
      .baselineVersion("43")
      .ignoreMissingMigrations(true)
      .load()
      .migrate()

我没试过,但是如果你删除了所有迁移,创建一个新的迁移,将新的起点创建为版本 1,将其设置为基线版本——然后修改你的配置以使用不同的 table(例如 flyway_schema_history_2)?

在现有数据库中,Flyway 会看到您有一个没有(已识别)flyway 的非空模式 table 并忽略基线迁移。在新环境中,它也会 运行 基线迁移。

我错过了什么吗?

(当然,另一个问题是如何生成 "compressed" 迁移。如果您不需要任何种子数据,您可以只对数据库进行仅模式备份并使用它。如果您迁移也会填充数据,您可能需要手动解决。)