首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果DB有较新的迁移版本,则跳过迁移。

如果DB有较新的迁移版本,则跳过迁移。
EN

Stack Overflow用户
提问于 2021-09-06 03:13:12
回答 1查看 1.6K关注 0票数 2

我有一个场景,如果我回滚回我的应用程序的前一个版本,迁移步骤将失败,与缺少的脚本有关的错误,例如。error: no migration found for version 10 error: file does not exist

我不希望回滚DB更改,而只是在这个场景中跳过运行迁移步骤。

我尝试在我的entrypoint.sh代码中实现一个简单的检查;但是,golang-migrate似乎没有提供一种通过cli检索(并保留) DB迁移版本的方法。

我在下面的示例中尝试了version命令,它打印当前版本。但是,不能将该值保存到变量中--我认为该命令在运行后与DB断开连接,并删除检索到的版本。

代码语言:javascript
复制
#!/bin/bash

set -euo pipefail

MIGRATION_COUNT=$(find /app/config/db/migrations/*.up.sql | wc -l)
echo 'MIGRATION_COUNT: ' $MIGRATION_COUNT

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

if [ "$MIGRATION_COUNT" -gt "$CURRENT_VERSION" ]; then
  /app/migrate \
  -source=file:///app/config/db/migrations/ \
  -database=<connection_string> \
  up
fi

/app/my-app

上面脚本的输出(您可以看到当前版本是10,但没有保存到CURRENT_VERSION变量):

代码语言:javascript
复制
Attaching to my_app
my_app     | MIGRATION_COUNT:  9
my_app     | 10
my_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库为这种逻辑找到任何选项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-06 05:38:21

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

这里是他们(去迁移的) Println函数的实现,用于打印您要捕获的版本字符串。

因此,与go迁移的开发人员相比,错误更少。按照惯例,只应将错误写入stderr,一般输出(如在您的情况下的版本号)应该写入stdout。

无论如何,要解决这个问题,您可以尝试这样的方法:

代码语言:javascript
复制
CURRENT_VERSION=$(/app/migrate -source=file:///app/config/db/migrations/ -database=<connection_string> version 2>&1)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69068781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档