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

飞行路线迁移令

华永逸
2023-03-14

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

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

这是如何在Flyway中实现的?如果并行添加迁移,如何控制顺序?

共有3个答案

华泽语
2023-03-14

我创建了一个简单的bash脚本,以便在创建迁移时添加时间戳前缀,就像rubyonrails一样。我对bash不太熟练,所以它很简单,但它完成了任务。

版本化的迁移名称如下:V20191010172609554\u迁移\u说明。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
邢皓
2023-03-14

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

例如:

V0_11_005_ddl_创建_模块_表格。sql

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

因此,想象一下,版本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

当开发人员2尝试合并其更改时,这将失败,因为两个文件具有相同的版本号。dev2只是将其重命名为V0_11_006_ddl_create_bar。sql。

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

钱飞翼
2023-03-14

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

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

 类似资料:
  • 在类路径中:/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名开发人员在不同

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

  • 我更改了一个错误的flyway脚本,这使我的迁移处于错误状态(我有5个脚本版本,但当我运行我的应用程序时,它从第4个开始,并得到一个错误“反应已经存在”)。我尝试从flyway cli使用clean,但它没有完全解决问题...此外,当我尝试将我的分支推送到git时,CI/CD管道将无法进行迁移。既然我在开发环境中,全部删除迁移脚本会是一个可怕的想法吗?删除所有脚本是否允许我在开发环境中“从头开始”

  • 有没有办法告诉flyway在不应用迁移的情况下重新创建flyway表。例如,查看迁移文件夹中的脚本,假设它们都已应用,并简单地确保flyway表包含所有脚本。 我们的方案是,我们不允许在生产和(ISO;银行、认证)原因。规则说我们需要完全删除表。因此,当我们从生产副本重置测试环境时,我们需要重新创建飞行道表。现在,我们从现有的测试环境中复制和粘贴,但有时这与生产不同步,并且会发生各种问题。 因此,