直接装migrate cli即可运行迁移,无需sdk集成;安装需用go install github.com/golang-migrate/migrate/v4/cmd/migrate@latest并确保$gopath/bin在path中;postgresql连接必须用postgres://前缀且加?sslmode=disable;迁移文件须按20240101120000_create_users.up.sql格式命名。

直接装 migrate CLI 就能跑迁移,不用在 Go 项目里写 SDK 集成——除非你明确需要启动时自动执行、或想用 GracefulStop 控制迁移生命周期。
go install 失败?大概率是模块路径和驱动没对上
Go 1.16+ 默认开启模块模式,老命令 go get github.com/golang-migrate/migrate 已失效。新地址带版本号:v4 是必须的。
- 正确安装命令:
go install github.com/golang-migrate/migrate/v4/cmd/migrate@latest - 如果要用 PostgreSQL,加
-tags 'postgres':否则运行时会报driver: unknown driver pgx或unknown driver postgres - 装完后检查
$GOPATH/bin是否在$PATH里(macOS/Linux 执行echo $PATH,Windows 看系统环境变量) - Windows PowerShell 用户可能需先运行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser才能执行本地二进制
连接 PostgreSQL 报错 “driver unknown”?别写 pgx://
migrate CLI 自带的预编译二进制已打包 postgres 驱动,但只认 postgres:// 前缀的连接串。哪怕你底层用 pgx,连接字符串也得写成 postgres://,否则直接失败。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 正确格式:
postgres://user:pass@localhost:5432/mydb?sslmode=disable - 错误格式:
pgx://...、postgresql://...、host=localhost...(后者是 lib/pq 的 DSN 格式,不被 migrate CLI 接受) - SSL 参数建议显式加
?sslmode=disable,避免开发环境因证书问题卡住 - 如需自定义迁移表名,加
&x-migrations-table=my_migrations
迁移文件命名不合规,up 就报 “no such file”
migrate 不按文件顺序读,而是靠文件名解析版本号排序。名字不对,它就找不到该执行哪个。
- 必须含时间戳或序号,比如
20240101120000_create_users.up.sql或001_create_users.up.sql - 扩展名严格匹配:
.up.sql和.down.sql成对出现,不能是.sql或.migrate.sql - 目录里不能混杂其他 SQL 文件(比如备份脚本),否则可能被误识别
- 推荐用
migrate create -ext sql -dir migrations -seq add_index生成,避免手误
真正容易被忽略的是迁移状态表的初始化时机:第一次 up 时,migrate 会自动建 schema_migrations 表,但如果你手动删过这个表,又没清空数据库里的残留记录,后续执行可能卡在“脏状态”,得用 force 命令重置版本号。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










