Golang Migrate数据库迁移工具

最近在学习Golang的数据库迁移,看到有推荐Migrate这个工具的,但不太清楚具体怎么使用。想请教几个问题:

  1. Migrate工具支持哪些数据库?MySQL和PostgreSQL都能用吗?
  2. 迁移文件的命名规范有什么要求?我看到有的用时间戳,有的用序号,哪种更好?
  3. 如何回滚到特定版本?是只能一步步回退,还是可以直接指定版本号?
  4. 在生产环境使用有什么需要注意的地方吗?比如并发执行的问题?

希望能有经验的朋友分享一下使用心得,特别是实际项目中的最佳实践。

2 回复

Golang Migrate是一款轻量高效的数据库迁移工具,支持版本控制和回滚,通过命令行或Go代码管理数据库结构变更,适用于生产环境。

更多关于Golang Migrate数据库迁移工具的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang Migrate 是一个基于 Go 语言开发的数据库迁移工具,用于管理数据库架构的版本控制。它支持多种数据库(如 PostgreSQL、MySQL、SQLite 等),通过创建和应用迁移文件来跟踪数据库变更。

主要特性:

  • 跨数据库支持:兼容主流数据库系统。
  • 命令行工具:通过简单命令管理迁移。
  • 版本控制:使用顺序编号或时间戳标记迁移文件。
  • 原子操作:确保迁移要么全部成功,要么回滚。
  • 集成友好:可嵌入 Go 项目或独立使用。

安装:

go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest

(根据数据库类型调整标签,如 mysqlsqlite3

基本用法:

  1. 创建迁移文件

    migrate create -ext sql -dir db/migrations -seq create_users_table
    

    生成 db/migrations/001_create_users_table.{up,down}.sql 文件。

  2. 编写迁移

    • up.sql:应用变更(如建表):
      CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT);
      
    • down.sql:回滚变更:
      DROP TABLE users;
      
  3. 应用迁移

    migrate -path db/migrations -database "postgres://user:pass[@localhost](/user/localhost):5432/dbname?sslmode=disable" up
    
  4. 回滚迁移

    migrate -path db/migrations -database "..." down 1
    

在 Go 代码中使用:

import (
    "github.com/golang-migrate/migrate/v4"
    _ "github.com/golang-migrate/migrate/v4/database/postgres"
    _ "github.com/golang-migrate/migrate/v4/source/file"
)

func main() {
    m, err := migrate.New(
        "file://db/migrations",
        "postgres://user:pass[@localhost](/user/localhost):5432/dbname?sslmode=disable",
    )
    if err != nil {
        log.Fatal(err)
    }
    defer m.Close()

    if err := m.Up(); err != nil && err != migrate.ErrNoChange {
        log.Fatal(err)
    }
}

注意事项:

  • 确保数据库连接字符串正确。
  • 生产环境建议使用版本控制管理迁移文件。
  • 测试 down 迁移以避免数据丢失。

通过 Golang Migrate,可以高效、安全地管理数据库演进。

回到顶部