golang 每日一庫之 pressly-goose
pressly/goose
是一個用於 Go 語言的數據庫遷移工具。它提供了一種簡單且高效的方式來管理數據庫 schema 的版本控制,適用於數據庫結構變更的管理和遷移。goose
的設計目標是讓數據庫遷移更加簡便、安全,並且在多環境下可以輕鬆應用。
數據庫遷移通常用於在應用程序中管理數據模式的變化(例如添加表、修改列、刪除索引等),尤其在團隊協作開發、生產環境發佈等情境下,遷移工具幫助開發者和運維人員確保數據庫的一致性。
安裝
要使用 pressly/goose
,你首先需要安裝它。在終端中運行以下命令來安裝 goose
:
go get github.com/pressly/goose/v3
或者,你也可以將其作爲一個可執行命令安裝:
go install github.com/pressly/goose/v3/cmd/goose@latest
功能概述
-
數據庫遷移
:
goose
通過維護遷移文件(通常是 SQL 腳本或 Go 語言代碼)來管理數據庫的版本。這些遷移文件記錄了數據庫結構變更的具體步驟。 -
版本控制
:每個遷移文件都有一個版本號,
goose
通過比對當前版本和目標版本來決定哪些遷移需要執行。 -
支持 SQL 腳本和 Go 代碼
:
goose
既支持通過 SQL 文件進行數據庫遷移,也支持通過 Go 代碼進行遷移,給開發者提供靈活的選擇。 -
回滾支持
:
goose
允許開發者回滾遷移操作,恢復到指定版本。
基本用法
goose
主要分爲兩個部分:命令行工具和 Go 語言 API。
1. 使用命令行工具
goose
提供了一個簡單的命令行工具來執行數據庫遷移操作。
1.1 初始化遷移
首先,在項目中創建一個 migrations
文件夾來存放數據庫遷移腳本。然後,通過命令行工具初始化該目錄:
goose create add_users_table sql
這條命令會創建一個新的 SQL 遷移文件,命名爲類似 20230210125633_add_users_table.sql
(包含時間戳),併爲你準備好了 SQL 文件模板。你可以根據需要修改它。
1.2 運行遷移
運行遷移腳本,將數據庫更新到最新版本。使用以下命令來執行遷移:
goose -dir ./migrations postgres "user=postgres db up
這裏的 up
命令會執行 migrations
目錄中的所有待執行的遷移。
-
-dir ./migrations
:指定遷移腳本的目錄。
-
postgres "user=postgres db
:這是連接數據庫的字符串,可以根據實際情況修改。
1.3 回滾遷移
如果你需要回滾某個遷移,可以使用 down
命令。比如,回滾最近的遷移:
goose -dir ./migrations postgres "user=postgres db down
你也可以回滾到指定版本:
goose -dir ./migrations postgres "user=postgres db down 2
這個命令會將數據庫回滾到倒數第二個版本。
1.4 查看遷移歷史
使用以下命令來查看已應用的遷移歷史:
goose -dir ./migrations postgres "user=postgres db status
這會列出所有遷移的狀態,顯示已執行和未執行的遷移。
1.5 創建 SQL 文件
你也可以直接創建一個 SQL 文件,手動編寫遷移腳本。創建 SQL 文件後,可以通過 up
或 down
命令執行。
goose create add_users_table sql
該命令會生成一個新的 SQL 文件,你可以在該文件中定義 SQL 查詢。例如,創建 users
表:
-- +migrate Up
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL
);
-- +migrate Down
DROP TABLE users;
2. 在 Go 中使用 Goose API
除了使用命令行工具,goose
還可以在 Go 程序中直接使用 API 來管理數據庫遷移。
2.1 初始化遷移
首先,初始化數據庫連接:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
"github.com/pressly/goose/v3"
)
func main() {
// 連接數據庫
db, err := sql.Open("postgres", "user=postgres db)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 執行遷移
if err := goose.Up(db, "./migrations"); err != nil {
log.Fatal(err)
}
fmt.Println("Database migrated successfully")
}
2.2 執行遷移
在代碼中,你可以通過調用 goose.Up
方法來執行遷移文件中的 up
操作。goose.Up
會檢查數據庫當前的版本,並自動執行所有未執行的遷移。
2.3 回滾遷移
類似地,可以使用 goose.Down
來回滾遷移:
if err := goose.Down(db, "./migrations"); err != nil {
log.Fatal(err)
}
你還可以使用 goose.GooseDownTo
來回滾到指定的版本:
if err := goose.GooseDownTo(db, "./migrations", 3); err != nil {
log.Fatal(err)
}
配置和選項
1. 指定數據庫連接字符串
在命令行中,你可以通過 postgres
、mysql
等指定不同類型的數據庫連接。每種數據庫都有不同的連接字符串格式。
例如,連接 PostgreSQL:
goose -dir ./migrations postgres "user=postgres db up
對於 MySQL:
goose -dir ./migrations mysql "user:password@tcp(127.0.0.1:3306)/dbname" up
2. 遷移腳本的命名約定
goose
默認會根據時間戳來爲遷移文件命名,命名規則是:<timestamp>_<migration_name>.sql
。其中 timestamp
是一個 13 位的時間戳(毫秒級),可以確保每個遷移文件都有唯一的名稱。
例如:
20230210125633_add_users_table.sql
20230210130020_add_email_to_users.sql
3. 版本控制
goose
會在數據庫中創建一個版本表(通常名爲 goose_db_version
),它存儲了數據庫的當前版本。當你運行遷移時,goose
會檢查此表以確定哪些遷移已經執行過,並按順序執行未執行的遷移。
示例項目
假設你有一個簡單的 Go 項目,使用 PostgreSQL 作爲數據庫,並且想要在項目中使用 goose
進行數據庫遷移管理。以下是如何設置遷移和執行的示例。
-
項目結構
:
/my_project
├── migrations/ # 存放遷移腳本
│ ├── 20230210125633_add_users_table.sql
│ └── 20230210130020_add_email_to_users.sql
├── main.go # Go 代碼
├── go.mod
└── go.sum
-
遷移腳本(
migrations/20230210125633_add_users_table.sql
):
-- +migrate Up
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL
);
-- +migrate Down
DROP TABLE users;
-
Go 代碼(
main.go
):
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
"github.com/pressly/goose/v3"
)
func main() {
// 連接數據庫
db, err := sql.Open("postgres", "user=postgres db)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 執行遷移
if err := goose.Up(db, "./migrations"); err != nil {
log.Fatal(err)
}
fmt.Println("Database migrated successfully")
}
總結
pressly/goose
是一個功能強大的數據庫遷移工具,適用於 Go 項目中對數據庫版本管理和遷移的需求。它支持 SQL 腳本和 Go 代碼兩種方式進行遷移,具有以下主要特點:
- 支持多種數據庫(如 PostgreSQL
、MySQL 等)。
-
提供命令行工具和 Go 語言 API。
-
支持數據庫遷移的執行、回滾、版本控制和查看。
-
簡單易用,適用於小型到中型項目的數據庫版本管理。
通過使用 goose
,你可以更加輕鬆和安全地管理數據庫 schema 的變化。
標題:golang 每日一庫之 pressly/goose
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/21/1740114574536.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/s2_2URt1E39YUJquuRaeAQ