[Go] golang-migrate/migrate 快速使用指南
1. CLI 用途的安装 [文档]
[确保] CLI 工具使用 go 命令安装时,不应该在 go.mod 所在的目录中执行命令,也就是先进入到其它非项目目录内。
$ go get -tags 'postgre' github.com/golang-migrate/migrate/v4/cmd/migrate
postgre 可以替换为适用你当前数据库的名称,共有这些支持的 database,未来构建的约束会被移除 [issue].
$ migrate --help
$ migrate -source file://path/to/migrations -database postgre://localhost:5432/database_name up 2 # 指定文件和数据库连接
$ migrate -database "$MY_MIGRATE_DATABASE" # 或者 从环境变量指定数据库连接的方式,其它方式参见文档
2. 另一种是 非 CLI ,在 go 项目中使用的方式
当前主要版本是 github.com/golang-migrate/migrate/v4
3. 快速开始
创建迁移:migrate create -ext sql -dir db/migrations -seq create_users_table
运行迁移:migrate -database YOUR_DATABASE_URL -path PATH_TO_YOUR_MIGRATIONS up
强制指定版本:migrate -path PATH_TO_YOUR_MIGRATIONS -database YOUR_DATABASE_URL force VERSION (example)
另外不同的数据库所使用的 DSN 会不一样, 使用不正确的有时候你会得到 error: default addr for network '127.0.0.1:3306' unknown
4. 实践
# 查看包创建的表 schema_migrations 里存的 version 值,比如:2(dirty)
migrate -path db/migrations -database "mysql://user:pass@(127.0.0.1:3306)/mydb?multiStatements=true" version
# 如果 migrate 遇到 error,那么 schema_migrations 表里当前 version 对应的 dirty 字段会标记为 1
# 将指定 version 的 dirty 更新为 0,使用如下命令,force 后面跟的是 version 值:
migrate -path db/migrations -database "mysql://user:pass@(127.0.0.1:3306)/mydb?multiStatements=true" force 2
Refer:golang-migrate