【问题标题】:Flyway migrations order航路迁移令
【发布时间】:2018-09-05 10:48:13
【问题描述】:

我们使用 Liquibase,现在在新项目中我们必须使用 Flyway。 在 liquibase 迁移顺序是在 xml 文件中,所以你指定什么迁移是第一和什么是第二,它不依赖于名称。

因此,当某些开发人员添加新迁移时,如果在此之前其他人推送了新迁移,他会在 Git 中遇到冲突,并且必须修复排序。

这是如何在 Flyway 中完成的?并行添加迁移如何控制顺序?

【问题讨论】:

    标签: liquibase flyway


    【解决方案1】:

    从阅读https://flywaydb.org/documentation/migrations开始

    对于唯一的版本号,您可以使用 wiki 页面或白板的一角来指示下一个可用的版本号是什么。然后,开发人员可以获取它并为下一个需要它的人更新它。或者,您也可以使用反向时间戳作为版本。

    【讨论】:

    • >下一个可用的版本号是什么 如果有 5 个人要进行迁移并且他们不知道谁会是第一个呢?
    • 再读一遍。这是我的答案。
    • dev1可以在dev2之前完成,但是dev1的迁移依赖于dev2的迁移,所以顺序会出错
    • 如果是这种情况,那么 dev1 和 dev2 必须真正相互通信,因为除了文件名中的版本号之外,很可能还有更多需要注意的事情。
    【解决方案2】:

    您应该就命名约定达成一致,这在发生冲突时很容易解决。

    例如:

    V0_11_005__ddl_create_module_table.sql

    其中 V0_11 是例如您当前的版本号。后跟一个 3 位数字,默认递增 5(例如)

    所以想象第 11 版是开发人员开始工作的新版本:

    • 开发者 1 正在创建 V0_11_005__ddl_create_foo.sql
    • 开发人员 2 是 创建 V0_11_005__ddl_create_bar.sql
    • 开发人员 1 推送更改并合并
    • 开发人员 3(从合并分支开始) 创建 V0_11_010_ddl_create_stuff.sql

    当 Developer 2 尝试合并他的更改时,这将失败,因为 2 个文件具有相同的版本号。 Dev 2 只是将其重命名为 V0_11_006__ddl_create_bar.sql。

    所以 Dev1、Dev2、Dev3 脚本的顺序就可以了。

    【讨论】:

    【解决方案3】:

    我创建了一个简单的 bash 脚本,用于在创建迁移时添加时间戳前缀,就像 Ruby on Rails 所做的那样。我不熟悉 bash,所以它很简单,但它可以完成工作。

    版本化的迁移名称如下所示:V20191010172609554__migration_description.sql

    #!/bin/bash
    
    set -e
    
    help="Create a blank migration for flyway.\n\nUsage:\n-d\tDescription of the migration (will be set as the filename). Surround description with \"\".\n-t\tThe type of the migration. R for reusable, V for versioned."
    
    while getopts ":t:d:h:" opt; do # get named arguments t, d, and h
      case $opt in
        t) type="$OPTARG"
        ;;
        d) desc="$OPTARG"
        ;;
        h) echo -e $help
        ;;
        \?) echo -e "Invalid option -$OPTARG \t Run with -help to see valid options." >&2
        ;;
      esac
    done
    
    if [[ -n $type && -n $desc ]]; then
    
      temp=$(echo "$desc" | sed "s/ /_/g") # replace spaces by underscores
      desc=$(echo "$temp" | sed "s/__/_/g") # replace possible duplicated underscores
    
      if [ "$type" == "V" ]; then
        timestamp="$(date +"%Y%m%d%H%M%S%3N")"
        migration_name=$type$timestamp"__"$desc.sql
      else
        migration_name=$type"__"$desc.sql
      fi
      touch "../migrations/"$migration_name
    
      echo "Created blank migration:"
      ls ../migrations/ | grep $migration_name 
      echo "in the migrations folder"
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2019-11-07
      • 1970-01-01
      • 2019-04-07
      • 2017-12-18
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多