为了账号安全,请及时绑定邮箱和手机立即绑定

golang 迁移 - 如果数据库具有较新的迁移版本,则跳过迁移

golang 迁移 - 如果数据库具有较新的迁移版本,则跳过迁移

Go
慕莱坞森 2022-09-26 20:13:46
我有一个场景,如果我回滚到应用程序的以前版本,迁移步骤将失败,并出现有关缺少脚本的错误,例如。error: no migration found for version 10 error: file does not exist我不希望回滚数据库更改,但只需跳过在此方案中运行迁移步骤。我尝试在我的代码中实现一个简单的检查;但是,golang 迁移似乎没有提供一种通过 cli 检索(和保留)数据库迁移版本的方法。entrypoint.sh我在下面的示例中尝试了打印当前版本的命令。但是,该值无法保存到变量中 - 我认为该命令在运行后会与数据库断开连接并擦除检索到的版本。version#!/bin/bashset -euo pipefailMIGRATION_COUNT=$(find /app/config/db/migrations/*.up.sql | wc -l)echo 'MIGRATION_COUNT: ' $MIGRATION_COUNTCURRENT_VERSION=$(/app/migrate -source=file:///app/config/db/migrations/ -database=<connection_string> version)echo 'CURRENT_VERSION: ' $CURRENT_VERSIONif [ "$MIGRATION_COUNT" -gt "$CURRENT_VERSION" ]; then  /app/migrate \  -source=file:///app/config/db/migrations/ \  -database=<connection_string> \  upfi/app/my-app上述脚本的输出(您可以看到当前版本是确实打印但不保存到CURRENT_VERSION变量):10Attaching to my_appmy_app     | MIGRATION_COUNT:  9my_app     | 10my_app     | CURRENT_VERSION:  [2021-09-06T03:00:55.8023451Z] [INFO] [app=myapp-migrate] Migrating database{"host":"db","port":5432,"dbname":"myappname","user":"myapp","password":"XXXXX","tls":{"mode":"disable"},"maxconn":25,"maxidle":3}my_app     | /app/entrypoint.sh: line 11: [: [2021-09-06T03:00:55.8023451Z] [INFO] [app=myapp-migrate] Migrating database{"host":"db","port":5432,"dbname":"myappname","user":"myapp","password":"XXXXX","tls":{"mode":"disable"},"maxconn":25,"maxidle":3}: integer expression expected想知道是否有人知道我如何在bash脚本中检索当前版本。如果没有,是否有另一种方法可以实现跳过迁移步骤?我无法使用库找到这种逻辑的任何选项golang-migrate
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

要解决这个问题,你必须首先明白,只捕获黑桫。因此,如果您执行一个将其结果写入 stdout 的函数,则您的解决方案是完全正确的,并且可以正常工作。由于您的解决方案对我来说似乎是正确的,因此我查看了您正在使用的工具中的代码,瞧,他们正在做一些相当混乱的事情。据我所知,几乎每个输出,无论是常规的还是错误的,都是通过使用Go的包写入的。但是,日志包具有使用通道而不是默认的属性 - 当然是正确的。$()logstderrstdout

下面是他们(go-migrate)用于打印您尝试捕获的版本字符串的函数的实现。Println

因此,与去迁移的开发人员相比,您的错误更少。按照惯例,只应将错误写入 stderr,而将常规输出(例如您案例中的版本号)写入 stdout。

无论如何,要解决此问题,您可以尝试如下操作:

CURRENT_VERSION=$(/app/migrate -source=file:///app/config/db/migrations/ -database=<connection_string> version 2>&1)

注意:此解决方案不安全,因为您现在正在 stdout 中发送 stderr,因此您可能会捕获变量中的实际错误,而不仅仅是版本号。所以要小心!


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信