Flyway迁移订单

时间:2018-03-27 06:37:55

标签: liquibase flyway

我们使用Liquibase,现在在新项目中我们必须使用Flyway。 在liquibase迁移中,顺序位于xml文件中,因此您可以指定首先迁移的内容和第二个迁移的内容,它不依赖于名称。

所以,当一些开发人员添加新的迁移时,如果在其他人推动新迁移之前,他会在Git中遇到冲突,并且必须修复排序。

在Flyway如何做到这一点?如果并行添加迁移,如何控制订单?

3 个答案:

答案 0 :(得分:0)

首先阅读https://flywaydb.org/documentation/migrations

对于唯一版本号,您可以使用类似维基页面或白板一角的内容来指示下一个可用版本号。然后,开发人员可以抓住它并为下一个需要的人更新它。或者,您也可以使用反向时间戳作为版本。

答案 1 :(得分:0)

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

例如:

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(从merged-branch开始) 创建V0_11_010_ddl_create_stuff.sql

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

所以Dev1,Dev2,Dev3脚本的顺序都没问题。

答案 2 :(得分:0)

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

版本化的迁移名称将类似于:V20191010172609609554__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