亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號