golang,go,博客,开源,编程

golang每日一库之pressly/goose

Published on with 0 views and 0 comments

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 dbname=test sslmode=disable" up

这里的 up 命令会执行 migrations 目录中的所有待执行的迁移。

  • -dir ./migrations:指定迁移脚本的目录。
  • postgres "user=postgres dbname=test sslmode=disable":这是连接数据库的字符串,可以根据实际情况修改。
1.3 回滚迁移

如果你需要回滚某个迁移,可以使用 down 命令。比如,回滚最近的迁移:

goose -dir ./migrations postgres "user=postgres dbname=test sslmode=disable" down

你也可以回滚到指定版本:

goose -dir ./migrations postgres "user=postgres dbname=test sslmode=disable" down 2

这个命令会将数据库回滚到倒数第二个版本。

1.4 查看迁移历史

使用以下命令来查看已应用的迁移历史:

goose -dir ./migrations postgres "user=postgres dbname=test sslmode=disable" status

这会列出所有迁移的状态,显示已执行和未执行的迁移。

1.5 创建 SQL 文件

你也可以直接创建一个 SQL 文件,手动编写迁移脚本。创建 SQL 文件后,可以通过 updown 命令执行。

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 dbname=test sslmode=disable")
	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 dbname=test sslmode=disable" 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 进行数据库迁移管理。以下是如何设置迁移和执行的示例。

  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 dbname=test sslmode=disable")
	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
联系:scotttu@163.com