Goose:Go语言渐进式的数据库迁移工具
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
工具的基本用法:
命令 | 描述 |
---|---|
up |
将数据库迁移到最新的版本 |
up-to |
迁移到特定版本 |
up-by-one |
从当前版本向上迁移一个版本 |
down |
回滚当前版本的前一个版本 |
down-to |
回滚到特定版本 |
redo |
回滚最新应用的迁移然后重新应用 |
status |
输出当前数据库的迁移状态 |
version |
输出数据库当前的版本 |
create |
创建新的迁移文件,可以选择 sql 或 go 格式 |
fix |
应用序列编号到迁移 |
validate |
检查迁移文件,而不实际运行 |
你可以设置环境变量 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
吧!
Go语言常见错误 | 不使用function option模式
点击关注并扫码添加进交流群领取「Go 语言」学习资料