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

1 回复

更多关于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

常用命令:

  1. 初始化迁移表

    ./migrate init
    
  2. 运行所有迁移

    ./migrate up
    
  3. 回滚最后一次迁移

    ./migrate down
    
  4. 回滚所有迁移

    ./migrate reset
    
  5. 查看当前版本

    ./migrate version
    
  6. 迁移到特定版本

    ./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)

最佳实践

  1. 保持迁移幂等性:确保迁移可以多次运行而不出错
  2. 小步迁移:每个迁移文件只做一件事
  3. 测试迁移:在测试环境中测试迁移和回滚
  4. 版本控制:将迁移文件纳入版本控制系统
  5. 文档化:在迁移文件中添加注释说明变更目的

错误处理

如果迁移失败,工具会返回错误信息。常见错误包括:

  • 数据库连接问题
  • SQL语法错误
  • 表已存在/不存在的冲突
  • 版本冲突

可以通过检查 migrations.Run() 的返回值来处理错误。

go-pg-migrate 提供了一种简单而强大的方式来管理数据库模式变更,特别适合使用 Go-PG 的 Go 项目。

回到顶部