GORM 简介

写 Go 项目绕不开数据库操作。原生 SQL 虽然灵活,但代码里到处拼接字符串实在让人头疼。GORM 就是来解决这个问题的——它是 Go 语言最流行的 ORM 库,让你用结构体和链式调用操作数据库,代码干净又好维护。

什么是 GORM

GORM 全称 Go Object Relational Mapping,简单说就是把数据库表映射成 Go 结构体,把 SQL 操作变成方法调用。你定义一个 User 结构体,GORM 帮你生成对应的 users 表;你想查用户,调用 db.First(&user, 1) 就行,不用手写 SELECT。

目前 GORM 已经是 Go 生态中最活跃的 ORM 项目,GitHub 星标超过 3 万,被大量项目采用。

GORM 能做什么

基本的 CRUD

// 创建
user := User{Name: "张三", Age: 25}
db.Create(&user)

// 查询
db.First(&user, 1)

// 更新
db.Model(&user).Update("Age", 26)

// 删除
db.Delete(&user)

复杂查询

db.Where("age > ?", 18).
   Where("name LIKE ?", "%张%").
   Order("created_at desc").
   Limit(10).
   Find(&users)

关联关系

type User struct {
    ID      uint
    Name    string
    Orders  []Order  // 一对多
}

type Order struct {
    ID     uint
    UserID uint
    User   User     // 属于
}

// 查询用户时自动加载订单
db.Preload("Orders").First(&user, 1)

数据库迁移

db.AutoMigrate(&User{}, &Order{})

为什么选择 GORM

开发效率高

不用手写 SQL,不用手动扫描结果到结构体。定义好模型,剩下的交给 GORM。

支持多种数据库

MySQL、PostgreSQL、SQLite、SQL Server 都能用,换数据库只改连接字符串,业务代码不用动。

功能完整

  • 关联关系(一对一、一对多、多对多)
  • 钩子函数(BeforeCreate、AfterUpdate 等)
  • 事务支持
  • 软删除
  • 批量操作
  • 原生 SQL 支持

社区活跃

遇到问题搜一下基本都有答案,官方文档也比较完善。

GORM 的局限

ORM 不是万能的,有些场景还是要用原生 SQL:

  • 复杂的报表查询,多层嵌套子查询
  • 需要极致性能优化的场景
  • 使用数据库特有功能

GORM 也考虑到了这点,提供了 Raw()Exec() 方法执行原生 SQL。

适用场景

GORM 适合:

  • 中小型项目的快速开发
  • CRUD 为主的业务系统
  • 需要支持多种数据库的项目
  • 团队成员 SQL 水平参差不齐

不太适合:

  • 超大规模、高并发系统(ORM 的抽象会有性能损耗)
  • 复杂的数据分析系统
  • 对 SQL 有精细控制的场景

版本说明

GORM 目前主版本是 v2,与 v1 有较大变化:

  • 使用 Go Modules
  • 性能优化
  • 新增功能(批量插入、Map 结果等)
  • API 有部分调整

本书内容基于 GORM v2,如果你还在用 v1,建议尽快升级。

小结

GORM 是 Go 语言中最成熟的 ORM 库,能显著提升开发效率。它把数据库操作抽象成对象方法调用,让你专注于业务逻辑而不是 SQL 细节。当然,ORM 不是银弹,复杂场景下原生 SQL 仍然不可替代。理解 GORM 的能力边界,在合适的场景使用它,才能真正发挥价值。