Goose:Go 語言漸進式的數據庫遷移工具
數據庫遷移是軟件開發過程中重要的一部分,隨着業務的發展和需求的變化,數據庫結構經常需要做出調整。Goose
是一個出色的數據庫遷移工具,它通過 SQL 腳本和 Go 函數支持漸進式的數據庫變化。下面是一篇詳細的文章,它將深入介紹 Goose
的用法,並提供豐富的示例幫助你開始使用 Goose
。
Goose 簡介
Goose 是一款能夠管理數據庫架構變更的工具,提供了一系列命令來幫助開發者創建和應用遷移。從 v3.0.0
版本開始,Goose
增加了對 Go 模塊的支持,同時也兼容了舊的 v2.x.y
版本。它支持將 SQL 遷移嵌入到 Go 應用中,要求 Go 版本 1.16 及以上。如果你使用的是 Go 1.15 或更低版本,則需要使用 v3.0.1
。
Goose 安裝
直接通過 go
命令安裝 Goose
:
go install github.com/pressly/goose/v3/cmd/goose@latest
此命令將會安裝 Goose
可執行文件到 $GOPATH/bin
目錄。
對於不希望安裝與數據庫連接相關命令的輕量版,可以使用獨有的構建標籤:
go build -tags='no_postgres no_mysql no_sqlite3 no_ydb' -o goose ./cmd/goose
對於 macOS 用戶,Goose
可以通過 Homebrew 安裝:
brew install goose
查看 Goose
文檔獲得更多安裝說明。
Goose 使用方法
以下表格說明了 Goose
工具的基本用法:
你可以設置環境變量 GOOSE_DRIVER
, GOOSE_DBSTRING
, 和 GOOSE_MIGRATION_DIR
來定製 Goose
的行爲。
SQL 遷移示例
一個 SQL 遷移文件應該包含升級(Up
)和(可選的)降級(Down
)部分。例如:
-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
);
-- +goose Down
-- SQL in section 'Down' is executed when this migration is rolled back
DROP TABLE users;
注意:遷移文件必須明確一次只有一個 Up
註釋。如果有 Down
註釋則必須放在 Up
後面。
Go 遷移示例
對於 Go 遷移,你需要創建一個自定義的 Goose
二進制可執行文件,並顯式註冊你的遷移函數。
package migrations
import (
"database/sql"
"github.com/pressly/goose/v3"
)
func init() {
goose.AddMigration(Up, Down)
}
func Up(tx *sql.Tx) error {
// perform a migration
return nil
}
func Down(tx *sql.Tx) error {
// perform a migration rollback
return nil
}
接下來,使用指令 goose up
應用遷移,或者使用 goose down
進行回滾。
高級特性
Goose
提供了一些高級特性,例如:
-
嵌入式遷移:從 Go 1.16 開始,可以在構建時將遷移文件嵌入二進制文件中,使用
embed
包實現。 -
環境變量替換:在 SQL 遷移文件中,可以通過特殊的註釋標記啓用環境變量替換。
-
混合版本管理:建議在開發過程中使用時間戳進行遷移,在生產環境中使用序列號的版本。
結論
Goose
是一種靈活且強大的遷移工具,適用於多種數據庫系統,支持 SQL 和 Go 兩種遷移方式。遵循本文的詳細介紹和示例,你將能夠輕鬆地開始使用 Goose
進行數據庫遷移。不要忘記,實踐是學習新技能的最好方式,因此立刻開始嘗試使用 Goose
吧!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jlL8vIiPd9ouXju2AIkeUA