golang,go,博客,开源,编程
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
通过比对当前版本和目标版本来决定哪些迁移需要执行。goose
既支持通过 SQL 文件进行数据库迁移,也支持通过 Go 代码进行迁移,给开发者提供灵活的选择。goose
允许开发者回滚迁移操作,恢复到指定版本。goose
主要分为两个部分:命令行工具和 Go 语言 API。
goose
提供了一个简单的命令行工具来执行数据库迁移操作。
首先,在项目中创建一个 migrations
文件夹来存放数据库迁移脚本。然后,通过命令行工具初始化该目录:
goose create add_users_table sql
这条命令会创建一个新的 SQL 迁移文件,命名为类似 20230210125633_add_users_table.sql
(包含时间戳),并为你准备好了 SQL 文件模板。你可以根据需要修改它。
运行迁移脚本,将数据库更新到最新版本。使用以下命令来执行迁移:
goose -dir ./migrations postgres "user=postgres dbname=test sslmode=disable" up
这里的 up
命令会执行 migrations
目录中的所有待执行的迁移。
-dir ./migrations
:指定迁移脚本的目录。postgres "user=postgres dbname=test sslmode=disable"
:这是连接数据库的字符串,可以根据实际情况修改。如果你需要回滚某个迁移,可以使用 down
命令。比如,回滚最近的迁移:
goose -dir ./migrations postgres "user=postgres dbname=test sslmode=disable" down
你也可以回滚到指定版本:
goose -dir ./migrations postgres "user=postgres dbname=test sslmode=disable" down 2
这个命令会将数据库回滚到倒数第二个版本。
使用以下命令来查看已应用的迁移历史:
goose -dir ./migrations postgres "user=postgres dbname=test sslmode=disable" status
这会列出所有迁移的状态,显示已执行和未执行的迁移。
你也可以直接创建一个 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;
除了使用命令行工具,goose
还可以在 Go 程序中直接使用 API 来管理数据库迁移。
首先,初始化数据库连接:
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")
}
在代码中,你可以通过调用 goose.Up
方法来执行迁移文件中的 up
操作。goose.Up
会检查数据库当前的版本,并自动执行所有未执行的迁移。
类似地,可以使用 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)
}
在命令行中,你可以通过 postgres
、mysql
等指定不同类型的数据库连接。每种数据库都有不同的连接字符串格式。
例如,连接 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
goose
默认会根据时间戳来为迁移文件命名,命名规则是:<timestamp>_<migration_name>.sql
。其中 timestamp
是一个 13 位的时间戳(毫秒级),可以确保每个迁移文件都有唯一的名称。
例如:
20230210125633_add_users_table.sql
20230210130020_add_email_to_users.sql
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;
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 代码两种方式进行迁移,具有以下主要特点:
、MySQL 等)。
通过使用 goose
,你可以更加轻松和安全地管理数据库 schema 的变化。