golang-migrate/migrate 是一个流行的数据库迁移工具,支持多种数据库(包括 SQLite、PostgreSQL、MySQL 等)。它帮助你通过版本控制的 SQL 脚本来管理数据库结构的变化,非常适合用于生产环境中数据库的迁移。
安装 golang-migrate/migrate
首先,安装 golang-migrate/migrate 工具:
# 安装 migrate 工具
go install github.com/golang-migrate/migrate/v4/cmd/migrate@latest安装完成后,你可以在终端中使用 migrate 命令。
创建迁移文件
migrate 通过 SQL 脚本文件来定义迁移。你可以使用以下命令创建一个新的迁移文件:
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(向上迁移,应用变更)
-- 创建 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(回滚迁移,撤销变更)
-- 删除 users 表
DROP TABLE IF EXISTS users;执行迁移
完成迁移文件的编写后,你可以使用 migrate 命令来应用迁移或回滚迁移。
应用迁移
运行以下命令应用所有尚未执行的迁移:
migrate -path migrations -database "sqlite3://gorm.db" up其中:
-path指定迁移脚本所在的目录。-database指定连接的数据库,这里使用的是 SQLite 连接字符串。你也可以根据数据库类型使用不同的连接字符串,例如 PostgreSQL 的连接字符串是postgres://user:password@localhost:5432/dbname?sslmode=disable。
回滚迁移
如果你需要回滚到上一个版本(撤销最近的迁移),可以运行以下命令:
migrate -path migrations -database "sqlite3://gorm.db" down如果你需要回滚多个版本,可以指定回滚次数,例如回滚 2 次:
migrate -path migrations -database "sqlite3://gorm.db" down 2查看当前数据库版本
你可以查看当前数据库的版本(即已经执行到哪个迁移):
migrate -path migrations -database "sqlite3://gorm.db" version管理迁移版本
migrate 会根据数据库中的版本表来跟踪执行过哪些迁移。版本表默认名为 schema_migrations,它会记录每次迁移的版本号。每个迁移文件的文件名中会有一个版本号,migrate 会根据这些版本号来按顺序执行迁移。
示例:完整流程
假设你已经创建了一个 Go 项目,并且需要进行迁移。完整流程如下:
创建迁移文件:
bashmigrate create -ext sql -dir migrations create_users_table编写迁移脚本:
000001_create_users_table.up.sql:sqlCREATE 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:sqlDROP TABLE IF EXISTS users;
执行迁移:
bashmigrate -path migrations -database "sqlite3://gorm.db" up查看当前版本:
bashmigrate -path migrations -database "sqlite3://gorm.db" version回滚迁移:
bashmigrate -path migrations -database "sqlite3://gorm.db" down
连接不同类型的数据库
golang-migrate/migrate 支持多个数据库,下面是不同数据库类型的连接字符串:
SQLite:
bashmigrate -path migrations -database "sqlite3://gorm.db" upPostgreSQL:
bashmigrate -path migrations -database "postgres://user:password@localhost:5432/dbname?sslmode=disable" upMySQL:
bashmigrate -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,你可以方便地管理数据库的版本,并确保不同环境中的数据库结构一致。