任何方式"压缩" Flyway迁移?

时间:2015-11-03 21:10:29

标签: flyway

我们正在使用Flyway迁移数据库架构,我们已经拥有100多个迁移脚本。

一旦我们被压扁了#34;多次迁移到单个第一版迁移中,这在开发期间是可以的,因为我们删除并重新创建模式。但是在生产中,这不会起作用,因为Flyway无法验证迁移。

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

我们正在使用MySQL。

我们该如何处理?

3 个答案:

答案 0 :(得分: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. 完成

答案 1 :(得分:0)

我们这样做是为了允许我们压缩脚本以在开发人员环境中构建新数据库,而且还可以在不登录和删除flyway_version_history表的情况下针对现有生产数据库运行,并且我们可以保留脚本(主要供参考):< / p>

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

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

在脚本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()

答案 2 :(得分:0)

我还没有尝试过,但是如果您删除了所有迁移,创建一个新迁移,该新迁移将新起点创建为版本1,将其设置为基准版本,然后修改配置以使用其他配置,该怎么办?表格(例如flyway_schema_history_2)?

在现有数据库中,Flyway将看到您具有一个非空模式,没有(公认的)flyway表,并且忽略了基线迁移。在新环境中,它也会运行基准迁移。

我想念什么吗?

(当然,另一个问题是如何生成“压缩的”迁移。如果不需要任何种子数据,则可以对数据库进行仅模式备份,并使用该备份。如果迁移也填充了数据)您可能需要手动解决。)