当前位置: 首页 > 知识库问答 >
问题:

有什么方法可以“压缩”飞行路线迁移吗?

鲁炳
2023-03-14

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

一旦我们将多个迁移“挤压”成一个单一的第一版本迁移,在开发过程中就可以了,因为我们删除并重新创建了模式。但在生产中,这是行不通的,因为Flyway无法验证迁移。

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

我们正在使用MySQL。

我们应该如何处理?

共有3个答案

华景明
2023-03-14

我还没有尝试过,但是如果您删除了所有迁移,创建一个新的迁移,将新的起点创建为版本1,将其设置为基准版本,然后修改配置以使用不同的表(例如flyway\u schema\u history\u 2)?

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

我遗漏了什么吗?

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

董子平
2023-03-14

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

将所有脚本压缩为一个新脚本,例如V1到V42压缩为一个新脚本V43。将V1到V42转换为文本文件。最后是txt。

将基线设置为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()
梁丘飞鸾
2023-03-14

这不就是重新基线化所能做的吗?

我对flyway还是个新手,但我认为这就是它的工作原理。请先测试以下内容,然后再相信我的话。

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

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

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

逐步解决方案

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

 类似资料:
  • 我们正在使用Flyway来迁移数据库模式,并且我们已经有了100多个迁移脚本。 一旦我们将多个迁移“压扁”为一个单一的第一版本迁移,在开发过程中,当我们删除并重新创建模式时,这就可以了。但在生产中,这是行不通的,因为Flyway无法验证迁移。 在这种情况下,我找不到任何文档或最佳实践。问题是文件数量不断增加,我不想每次都看到数千个迁移文件,本质上是如果生产已经在最新版本。我的意思是,那些版本号低于

  • 我们使用Liquibase,现在在新项目中,我们必须使用Flyway。在liquibase中,迁移顺序在xml文件中,所以您可以指定什么是第一次迁移,什么是第二次迁移,它不依赖于名称。 所以,当一些开发人员添加新的迁移时,如果之前有人推动了新的迁移,那么他将在Git中遇到冲突,并且必须修复顺序。 这是如何在Flyway中实现的?如果并行添加迁移,如何控制顺序?

  • 我们有一个用于填充表的迁移,但是由于我们刚刚开始开发,因此此数据经常更改。因此,我们想知道我们是否可以更新这样的迁移脚本,并要求flyway回滚它(以前的版本)并再次执行它(新版本)。事实上,如果这是可能的,也就是说,如果迁移是可变的,那么我们想象需要回滚并再次执行每个后续迁移,以确保它们没有受到影响。我们认为,这可以避免移徙在发展过程中的扩散。

  • 在类路径中:/db。迁移有迁移但flyway没有看到这一点,而是爱上了msg 2022-05-02 17:28:07.993INFO 45296 --- [ restartedMain]c. c. c. ConfigServiceProperty tySourceLocator:从服务器获取配置,地址为:http://localhost:8888/story2022-05-02 17:28:08.

  • 我为命令行java迁移执行了以下步骤: < li >创建java文件 当我执行迁移逗号时,它会像 警告:无法解析位置类路径:db/迁移 请查看下面的附件图片,它实际上是罐子。我已经提取了更多信息。

  • 目前,我们公司通过手动创建、分发和运行必要的SQL脚本来处理所有数据库模式更改。显然,这会导致各种机器偶尔更新和稀疏更新的问题。 我正在研究更现代的方法来解决这个问题,而Flyway现在是主要的候选人(尽管如果可以提出令人信服的论据,我们仍然愿意使用Liquibase)。 正常流程很简单,和宣传的一样简单,但是我们不知道如何正确处理冲突的迁移脚本。例如,不同个人分支(A和B)上的2名开发人员在不同