golang实现go-pg数据库迁移管理的CLI友好插件库go-pg-migrate的使用
go-pg-migrate - PostgreSQL数据库迁移管理工具
go-pg-migrate是一个CLI友好的PostgreSQL数据库迁移管理库,专为go-pg设计。
安装
需要启用Go Modules:
go get github.com/lawzava/go-pg-migrate/v2
使用说明
初始化migrate
时需要提供配置选项,主要配置项包括:
DatabaseURI
: 数据库连接字符串,格式为postgres://user:password@host:port/database?sslmode=disable
VersionNumberToApply
: 指定要应用到的迁移版本号PrintVersionAndExit
: 如果为true,仅打印当前应用的版本号而不执行迁移ForceVersionWithoutMigrations
: 如果为true,不执行迁移但将指定版本号标记为已应用RefreshSchema
: 如果为true,在应用迁移前会删除并重建public模式,适用于测试和CI环境
完整示例
以下是一个完整的go-pg-migrate使用示例:
package main
import (
"log"
"os"
"github.com/go-pg/pg/v10"
"github.com/lawzava/go-pg-migrate/v2"
)
func main() {
// 初始化数据库连接
db := pg.Connect(&pg.Options{
Addr: "localhost:5432",
User: "postgres",
Password: "password",
Database: "mydb",
})
defer db.Close()
// 配置迁移选项
options := migrate.Options{
DatabaseURI: "postgres://postgres:password@localhost:5432/mydb?sslmode=disable",
VersionNumberToApply: 0, // 0表示应用所有迁移
PrintVersionAndExit: false,
ForceVersionWithoutMigrations: false,
RefreshSchema: false,
}
// 创建迁移器实例
migrator := migrate.New(db, options)
// 执行迁移
if err := migrator.Run(); err != nil {
log.Fatalf("failed to run migrations: %v", err)
os.Exit(1)
}
log.Println("migrations applied successfully")
}
迁移文件结构
go-pg-migrate要求迁移文件按照特定格式组织:
migrations/
├── 1_create_users_table.up.sql
├── 1_create_users_table.down.sql
├── 2_add_index_to_users.up.sql
├── 2_add_index_to_users.down.sql
每个迁移需要包含一个.up.sql
文件(正向迁移)和一个.down.sql
文件(回滚迁移)。
示例迁移文件内容:
1_create_users_table.up.sql
:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
1_create_users_table.down.sql
:
DROP TABLE IF EXISTS users;
通过这种结构化的方式,go-pg-migrate可以方便地管理数据库模式的变更历史。
更多关于golang实现go-pg数据库迁移管理的CLI友好插件库go-pg-migrate的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现go-pg数据库迁移管理的CLI友好插件库go-pg-migrate的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-pg-migrate 数据库迁移管理工具使用指南
go-pg-migrate 是一个专为 Go-PG ORM 设计的数据库迁移管理工具,它提供了 CLI 友好的方式来管理数据库迁移。下面我将详细介绍如何使用这个工具。
安装
首先安装 go-pg-migrate:
go get github.com/go-pg/migrations/v8
基本使用
1. 初始化迁移
创建一个 migrations
目录来存放迁移文件:
mkdir -p migrations
2. 创建迁移文件
迁移文件命名格式为 [version]_[description].go
,例如 0001_create_users_table.go
。
// migrations/0001_create_users_table.go
package migrations
import (
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
)
func init() {
up := func(db *pg.DB) error {
_, err := db.Exec(`
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
)
`)
return err
}
down := func(db *pg.DB) error {
_, err := db.Exec(`DROP TABLE users`)
return err
}
migrations.MustRegisterTx(up, down)
}
3. 主程序集成
创建一个主程序来管理迁移:
// main.go
package main
import (
"flag"
"fmt"
"os"
"github.com/go-pg/migrations/v8"
"github.com/go-pg/pg/v10"
)
const usageText = `This program runs command on the db. Supported commands are:
- init - creates version info table in the database
- up - runs all available migrations
- up [target] - runs available migrations up to the target one
- down - reverts last migration
- reset - reverts all migrations
- version - prints current db version
- set_version [version] - sets db version without running migrations
Usage:
go run *.go <command> [args]
`
func main() {
flag.Usage = usage
flag.Parse()
db := pg.Connect(&pg.Options{
Addr: "localhost:5432",
User: "postgres",
Password: "postgres",
Database: "test_db",
})
oldVersion, newVersion, err := migrations.Run(db, flag.Args()...)
if err != nil {
exitf(err.Error())
}
if newVersion != oldVersion {
fmt.Printf("migrated from version %d to %d\n", oldVersion, newVersion)
} else {
fmt.Printf("version is %d\n", oldVersion)
}
}
func usage() {
fmt.Print(usageText)
flag.PrintDefaults()
os.Exit(2)
}
func exitf(format string, args ...interface{}) {
fmt.Fprintf(os.Stderr, format+"\n", args...)
os.Exit(1)
}
CLI 命令使用
编译并运行程序:
go build -o migrate && ./migrate
常用命令:
-
初始化迁移表:
./migrate init
-
运行所有迁移:
./migrate up
-
回滚最后一次迁移:
./migrate down
-
回滚所有迁移:
./migrate reset
-
查看当前版本:
./migrate version
-
迁移到特定版本:
./migrate up 3 # 迁移到版本3
高级功能
1. 事务管理
MustRegisterTx
会自动将迁移包装在事务中。如果不想使用事务,可以使用 MustRegister
:
migrations.MustRegister(func(db *pg.DB) error {
// 非事务迁移
}, func(db *pg.DB) error {
// 回滚
})
2. 自定义迁移表名
默认使用 gopg_migrations
表,可以自定义:
migrations.SetTableName("custom_migrations_table")
3. 禁用日志
migrations.SetLogger(nil)
最佳实践
- 保持迁移幂等性:确保迁移可以多次运行而不出错
- 小步迁移:每个迁移文件只做一件事
- 测试迁移:在测试环境中测试迁移和回滚
- 版本控制:将迁移文件纳入版本控制系统
- 文档化:在迁移文件中添加注释说明变更目的
错误处理
如果迁移失败,工具会返回错误信息。常见错误包括:
- 数据库连接问题
- SQL语法错误
- 表已存在/不存在的冲突
- 版本冲突
可以通过检查 migrations.Run()
的返回值来处理错误。
go-pg-migrate 提供了一种简单而强大的方式来管理数据库模式变更,特别适合使用 Go-PG 的 Go 项目。