任何“压缩”Flyway迁移的方法?

问题描述 投票:16回答:3

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

一旦我们将多个迁移“压缩”到单个第一版迁移中,这在开发期间就可以了,因为我们删除并重新创建模式。但是在生产中这不起作用,因为Flyway无法验证迁移。

在这种情况下,我找不到任何文档或最佳做法。问题是文件数量不断增加,我不希望每次都看到数千个迁移文件,基本上如果生产已经是最新版本。我的意思是,版本号低于生产版本的迁移脚本与我们无关,如果我们可以将这些文件压缩到单个迁移中,那将是非常棒的。

我们正在使用MySQL。

我们该如何处理?

flyway
3个回答
15
投票

这不是重新基线会做什么的吗?

我还是飞路新手,但这就是我认为它会起作用的方式。在接受我的说法之前,请先测试以下内容。

删除schema_version表。删除迁移脚本。

运行flyway基线(这会重新创建schema_version表并将基线记录添加为版本1)

现在你很高兴。请记住,由于您已删除所有迁移脚本,因此无法“迁移”到任何先前版本,但这对您来说可能不是问题。

一步一步的解决方案:

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

2
投票

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

将所有脚本压缩到新脚本,例如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()

0
投票

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

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

我错过了什么吗?

(当然另一个问题是如何生成“压缩”迁移。如果您不需要任何种子数据,您可以只进行数据库的模式备份并使用它。如果您的迁移也填充数据,那么您可能会必须手动完成。)

© www.soinside.com 2019 - 2024. All rights reserved.