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 主要分爲兩個部分:命令行工具和 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 目錄中的所有待執行的遷移。

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. 指定數據庫連接字符串

在命令行中,你可以通過 postgresmysql 等指定不同類型的數據庫連接。每種數據庫都有不同的連接字符串格式。

例如,連接 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 位的時間戳(毫秒級),可以確保每個遷移文件都有唯一的名稱。

例如:

3. 版本控制

goose 會在數據庫中創建一個版本表(通常名爲 goose_db_version),它存儲了數據庫的當前版本。當你運行遷移時,goose 會檢查此表以確定哪些遷移已經執行過,並按順序執行未執行的遷移。

示例項目

假設你有一個簡單的 Go 項目,使用 PostgreSQL 作爲數據庫,並且想要在項目中使用 goose 進行數據庫遷移管理。以下是如何設置遷移和執行的示例。

  1. 項目結構

/my_project
├── migrations/        # 存放遷移腳本
│   ├── 20230210125633_add_users_table.sql
│   └── 20230210130020_add_email_to_users.sql
├── main.go            # Go 代碼
├── go.mod
└── go.sum
  1. 遷移腳本(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;
  1. 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 代碼兩種方式進行遷移,具有以下主要特點:

、MySQL 等)。

通過使用 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