GORM V2 必须配合 Go Modules 使用且驱动需单独安装;GO111MODULE=off 会直接报错,go mod init 后须立即执行 go env -w GO111MODULE=on 和 go env -w GOPROXY=https://goproxy.cn,direct;gorm.io/gorm 与驱动(如 gorm.io/driver/mysql)须分步安装;达梦数据库需手动集成 dmgorm1/dmgorm2 模块并用 replace 替换路径;V2 中 gorm.Open 必须传入 mysql.Open(dsn) 实例而非字符串。

GORM V2 必须配合 Go Modules 使用,且驱动需单独安装;GO111MODULE=off 时会直接失败,不是警告而是报错。
go mod init 后必须立刻设置 GO111MODULE=on
Go 1.13+ 默认启用 modules,但部分旧项目或 IDE(如早期 Goland)仍可能沿用 GOPATH 模式。若 go mod init 后执行 go mod tidy 报错 “no required module provides package gorm.io/gorm”,大概率是模块未真正启用。
验证方式:go env GO111MODULE 输出应为 on,不是 auto 或 off。若非 on,立即执行:
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
注意:GOPROXY 必须包含 direct 作为兜底,否则私有仓库或离线环境会卡死。
gorm.io/gorm 和驱动必须分两步 install
GORM V2 拆分了核心库与数据库驱动,gorm.io/gorm 不含任何驱动逻辑。只装核心库会导致 sql.Open("mysql", ...) 失败,因为 mysql 驱动根本没注册。
正确顺序和命令:
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
go get -u gorm.io/gorm(核心库) -
go get -u gorm.io/driver/mysql(MySQL 驱动,按需替换为postgres、sqlite等) -
go mod tidy(自动补全 indirect 依赖,如golang.org/x/sys)
常见错误:cannot use "mysql" as mysql driver —— 就是漏装驱动,或装了但 import _ "gorm.io/driver/mysql" 没写在 main 包里(虽然 GORM V2 多数情况可省略该行,但某些构建环境仍需显式导入)。
达梦数据库(DM)需手动集成 dmgorm 模块
达梦官方未提供 gorm.io/driver/dm,其 Go 驱动不兼容标准 database/sql 接口,必须使用社区维护的 dmgorm1 或 dmgorm2 模块。
Windows 下典型路径问题:
- 不要把
dm.zip解压后丢进$GOROOT/src—— Go Modules 模式下完全无视该路径 - 应解压
dmgorm1.zip到项目根目录下drivers/dmgorm1,然后在go.mod中 replace:
replace dmgorm1 => ./drivers/dmgorm1
Linux 下可用预编译的 dm.zip,但必须确保 CGO_ENABLED=1 且已安装达梦客户端头文件和库(libdmdpi.so)。
go mod tidy 不会自动下载间接依赖的源码
go mod tidy 只更新 go.mod 和 go.sum,不会把驱动源码拉到本地 pkg/mod 目录供编辑器跳转。如果 Goland 提示 “Cannot resolve symbol” 或无法 Ctrl+Click 进入 gorm.Config,需要手动触发:
-
go list -m all | grep gorm确认版本已加载 - 在 Goland 中点击右上角 File → Reload project,或执行
go mod vendor后配置 vendor 目录为 Sources - 避免直接修改
pkg/mod下的只读文件,所有定制(如 patch driver)应通过replace指向本地路径
最易被忽略的一点:GORM 的 Open 函数签名在 V2 中强制要求传入驱动实例(如 mysql.Open(dsn)),而不是字符串。这意味着哪怕驱动已安装,gorm.Open("mysql", dsn) 在 V2 中根本不存在——必须看文档确认驱动包的 Open 函数位置。

















