应通过app.RegisterDependency(*gorm.DB)注册GORM单例,在database/database.go中初始化并配置连接池,Controller构造函数注入使用;Model须显式标注主键、时间戳、软删及外键;事务须用db.Transaction()封装,全程使用tx。

直接用 app.RegisterDependency(*gorm.DB) 注册全局单例,别在每个 handler 里调 gorm.Open —— 否则连接数爆炸、服务几分钟就崩。
怎么初始化 GORM 并挂到 Iris 全局可用
不能靠包级变量硬塞,得走 Iris 的依赖注入机制,否则单元测试没法 mock,线上也难替换实例。
-
database/database.go里定义init()函数:解析 DSN、调gorm.Open、拿到*sql.DB后立刻设SetMaxOpenConns(100)和SetMaxIdleConns(20) - 调用
app.RegisterDependency(DB),注册类型为*gorm.DB,不是*sql.DB - 千万别在 controller 或 handler 里写
defer DB.Close()—— 这是全局实例,关了整个服务就断库 - 如果用配置文件,DSN 中必须带
parseTime=True&loc=Local,否则时间字段解析失败
Controller 构造函数里怎么安全注入和使用 GORM
Iris MVC 的 controller 不自动绑定 ORM,你得显式声明依赖,否则 runtime panic 是常态。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- controller 结构体字段不写
db *gorm.DB,而是在构造函数参数里接收:func NewUserController(db *gorm.DB) *UserController - 确保
app.RegisterDependency注册的类型和构造函数参数类型完全一致(包括指针层级) - 查数据前先校验请求参数:
page := c.URLParamIntDefault("page", 1),再限制范围:if size > 100 { size = 100 } - 分页必须用 Scope 封装:
db.Scopes(paginate(page, size)).Find(&users),别手写Offset().Limit(),顺序错 MySQL 直接报错
GORM Model 定义容易被忽略的关键 tag
少一个 tag,First() 可能返回空、Count() 算不准、软删失效 —— 这些问题上线后极难排查。
- 主键必须显式标注:
ID uint `gorm:"primaryKey"`,否则 GORM 默认找ID字段但不加约束 - 时间字段要配
autoCreateTime和autoUpdateTime:CreatedAt time.Time `gorm:"autoCreateTime"` - 软删除字段必须是
*time.Time类型 +gorm.DeletedAttag:DeletedAt gorm.DeletedAt `gorm:"index"` - 外键关联需明确写
foreignKey和references,例如:UserID uint `gorm:"foreignKey:UserID"`
事务必须用 db.Transaction() 函数式封装,且全程只用 tx 实例 —— 混用 db 和 tx 会导致部分操作没进事务,还查不到错误。

















