Skip to content

golang-migrate/migrate 是一个流行的数据库迁移工具,支持多种数据库(包括 SQLite、PostgreSQL、MySQL 等)。它帮助你通过版本控制的 SQL 脚本来管理数据库结构的变化,非常适合用于生产环境中数据库的迁移。

安装 golang-migrate/migrate

首先,安装 golang-migrate/migrate 工具:

bash
# 安装 migrate 工具
go install github.com/golang-migrate/migrate/v4/cmd/migrate@latest

安装完成后,你可以在终端中使用 migrate 命令。

创建迁移文件

migrate 通过 SQL 脚本文件来定义迁移。你可以使用以下命令创建一个新的迁移文件:

bash
migrate create -ext sql -dir migrations create_users_table

上面的命令将会在 migrations 目录下创建两个 SQL 文件:

  • migrations/000001_create_users_table.up.sql(用于创建表)
  • migrations/000001_create_users_table.down.sql(用于回滚迁移)

编写迁移 SQL

然后,你需要编写 SQL 脚本来定义迁移的操作。

000001_create_users_table.up.sql(向上迁移,应用变更)

sql
-- 创建 users 表
CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL UNIQUE,
    password TEXT NOT NULL,
    email TEXT UNIQUE,
    created_at DATETIME,
    updated_at DATETIME
);

000001_create_users_table.down.sql(回滚迁移,撤销变更)

sql
-- 删除 users 表
DROP TABLE IF EXISTS users;

执行迁移

完成迁移文件的编写后,你可以使用 migrate 命令来应用迁移或回滚迁移。

应用迁移

运行以下命令应用所有尚未执行的迁移:

bash
migrate -path migrations -database "sqlite3://gorm.db" up

其中:

  • -path 指定迁移脚本所在的目录。
  • -database 指定连接的数据库,这里使用的是 SQLite 连接字符串。你也可以根据数据库类型使用不同的连接字符串,例如 PostgreSQL 的连接字符串是 postgres://user:password@localhost:5432/dbname?sslmode=disable

回滚迁移

如果你需要回滚到上一个版本(撤销最近的迁移),可以运行以下命令:

bash
migrate -path migrations -database "sqlite3://gorm.db" down

如果你需要回滚多个版本,可以指定回滚次数,例如回滚 2 次:

bash
migrate -path migrations -database "sqlite3://gorm.db" down 2

查看当前数据库版本

你可以查看当前数据库的版本(即已经执行到哪个迁移):

bash
migrate -path migrations -database "sqlite3://gorm.db" version

管理迁移版本

migrate 会根据数据库中的版本表来跟踪执行过哪些迁移。版本表默认名为 schema_migrations,它会记录每次迁移的版本号。每个迁移文件的文件名中会有一个版本号,migrate 会根据这些版本号来按顺序执行迁移。

示例:完整流程

假设你已经创建了一个 Go 项目,并且需要进行迁移。完整流程如下:

  1. 创建迁移文件

    bash
    migrate create -ext sql -dir migrations create_users_table
  2. 编写迁移脚本

    • 000001_create_users_table.up.sql

      sql
      CREATE TABLE users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          username TEXT NOT NULL UNIQUE,
          password TEXT NOT NULL,
          email TEXT UNIQUE,
          created_at DATETIME,
          updated_at DATETIME
      );
    • 000001_create_users_table.down.sql

      sql
      DROP TABLE IF EXISTS users;
  3. 执行迁移

    bash
    migrate -path migrations -database "sqlite3://gorm.db" up
  4. 查看当前版本

    bash
    migrate -path migrations -database "sqlite3://gorm.db" version
  5. 回滚迁移

    bash
    migrate -path migrations -database "sqlite3://gorm.db" down

连接不同类型的数据库

golang-migrate/migrate 支持多个数据库,下面是不同数据库类型的连接字符串:

  • SQLite

    bash
    migrate -path migrations -database "sqlite3://gorm.db" up
  • PostgreSQL

    bash
    migrate -path migrations -database "postgres://user:password@localhost:5432/dbname?sslmode=disable" up
  • MySQL

    bash
    migrate -path migrations -database "mysql://user:password@tcp(localhost:3306)/dbname" up

总结

  • 创建迁移:使用 migrate create 命令创建 SQL 文件。
  • 编写迁移脚本:在 .up.sql 文件中定义数据库变更,在 .down.sql 文件中定义回滚操作。
  • 执行迁移:使用 migrate up 执行迁移,migrate down 执行回滚。
  • 查看版本:使用 migrate version 查看当前数据库迁移版本。

通过 golang-migrate/migrate,你可以方便地管理数据库的版本,并确保不同环境中的数据库结构一致。