gorm v2(gorm.io/gorm)必须启用go modules,安装核心库和对应驱动(如gorm.io/driver/mysql),调用gorm.open需传入方言实例和&gorm.config{},dsn须含parsetime=true和loc=local,automigrate仅操作表不创建库。

直接用 go get 拉新版本,别碰旧版 github.com/jinzhu/gorm —— 它已归档停更,现在所有官方维护、文档、bug 修复都集中在 gorm.io 下。
确认 Go 环境和模块模式已启用
GORM v2(即 gorm.io/gorm)强制要求开启 Go modules。如果 go env GOPROXY 返回空或报错,说明模块未生效:
- 执行
go env -w GO111MODULE=on强制启用 - 检查当前目录下是否有
go.mod文件;没有就先运行go mod init your-project-name - 别在
$GOPATH/src下操作,那会触发老式 GOPATH 模式,导致依赖解析失败
安装 GORM 核心库和对应数据库驱动
以 MySQL 为例,必须同时装两个包:核心 ORM + 数据库方言驱动。缺一不可,否则 gorm.Open 会 panic 报 unsupported driver:
go get -u gorm.io/gormgo get -u gorm.io/driver/mysql
PostgreSQL、SQLite、SQL Server 同理,只换驱动路径:
- PostgreSQL:
gorm.io/driver/postgres - SQLite:
gorm.io/driver/sqlite - SQL Server:
gorm.io/driver/sqlserver
注意:gorm.io/driver/mysql 内部已封装连接池、字符集、时区等默认配置,不再需要手动导入 _ "github.com/go-sql-driver/mysql"。
初始化 DB 实例时传参不能省略 &gorm.Config{}
v2 版本废弃了字符串式调用(如 gorm.Open("mysql", dsn)),必须显式传入方言实例和配置对象。常见错误是漏掉 &gorm.Config{} 或写成 gorm.Config{}(少取地址符):
// ✅ 正确
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// ❌ 错误:缺少 &,或漏掉 Config
db, err := gorm.Open(mysql.Open(dsn), gorm.Config{}) // panic: invalid operation
db, err := gorm.Open("mysql", dsn) // panic: unsupported driver "mysql"
生产环境建议至少加日志和连接池配置:
-
Logger: logger.Default.LogMode(logger.Info)查 SQL -
ConnPool: &sql.DB{...}复用已有连接池(如从sql.Open创建的)
AutoMigrate 不会自动创建数据库,只操作已有库内的表
很多人卡在这一步:跑 db.AutoMigrate(&User{}) 却提示 ERROR: database "xxx" does not exist。这是因为 AutoMigrate 只负责建表/加字段,不负责建库 —— 数据库必须提前手动创建好:
- MySQL:用
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - PostgreSQL:用
createdb mydb或 pgAdmin 新建 - SQLite:路径存在即可,
test.db会自动创建文件
另外,AutoMigrate 不删字段、不改类型、不处理索引变更,仅做“最小安全同步”。字段重命名或类型变更需手写 migration 或用 db.Migrator().RenameColumn 等方法。
最常被忽略的是 DSN 中的 parseTime=True 和 loc=Local —— 缺一个,time.Time 字段就会变成零值或 panic;还有就是新手习惯性把 gorm.Open 放在函数里反复调用,结果连接池泄漏、句柄耗尽。DB 实例该全局复用,不该按请求 new。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











