【发布时间】:2018-09-05 10:48:13
【问题描述】:
我们使用 Liquibase,现在在新项目中我们必须使用 Flyway。 在 liquibase 迁移顺序是在 xml 文件中,所以你指定什么迁移是第一和什么是第二,它不依赖于名称。
因此,当某些开发人员添加新迁移时,如果在此之前其他人推送了新迁移,他会在 Git 中遇到冲突,并且必须修复排序。
这是如何在 Flyway 中完成的?并行添加迁移如何控制顺序?
【问题讨论】:
我们使用 Liquibase,现在在新项目中我们必须使用 Flyway。 在 liquibase 迁移顺序是在 xml 文件中,所以你指定什么迁移是第一和什么是第二,它不依赖于名称。
因此,当某些开发人员添加新迁移时,如果在此之前其他人推送了新迁移,他会在 Git 中遇到冲突,并且必须修复排序。
这是如何在 Flyway 中完成的?并行添加迁移如何控制顺序?
【问题讨论】:
从阅读https://flywaydb.org/documentation/migrations开始
对于唯一的版本号,您可以使用 wiki 页面或白板的一角来指示下一个可用的版本号是什么。然后,开发人员可以获取它并为下一个需要它的人更新它。或者,您也可以使用反向时间戳作为版本。
【讨论】:
您应该就命名约定达成一致,这在发生冲突时很容易解决。
例如:
V0_11_005__ddl_create_module_table.sql
其中 V0_11 是例如您当前的版本号。后跟一个 3 位数字,默认递增 5(例如)
所以想象第 11 版是开发人员开始工作的新版本:
当 Developer 2 尝试合并他的更改时,这将失败,因为 2 个文件具有相同的版本号。 Dev 2 只是将其重命名为 V0_11_006__ddl_create_bar.sql。
所以 Dev1、Dev2、Dev3 脚本的顺序就可以了。
【讨论】:
我创建了一个简单的 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
【讨论】: