GORM 入门:安装、连接 MySQL、AutoMigrate 与基础 CRUD

GORM 是 Go 生态中使用最广的 ORM 库,v2 版本把 API 收敛得更一致:链式方法、gorm.DB 复用、软删除与钩子开箱即用。本章从零开始:安装、连接 MySQL、自动建表与最基础的增删改查,API 以官方文档 gorm.io 为准。

1. 安装依赖

需要两个包:GORM 本体与 MySQL 驱动,v2 的驱动包名是 gorm.io/driver/mysql

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

2. 连接 MySQL

mysql.Open(dsn) 构造驱动,再交给 gorm.Open。DSN 推荐显式写 charset=utf8mb4&parseTime=True&loc=Local,否则字符集与时间字段容易出问题:

dsn := "root:secret@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    log.Fatalf("connect mysql: %v", err)
}

// 拿到底层 *sql.DB 配置连接池
sqlDB, _ := db.DB()
sqlDB.SetMaxOpenConns(50)
sqlDB.SetMaxIdleConns(10)

3. 定义模型并 AutoMigrate

结构体对应一张表,字段按蛇形自动映射为列名:

type User struct {
    ID        uint      `gorm:"primaryKey"`
    Name      string    `gorm:"size:64;not null"`
    Email     string    `gorm:"uniqueIndex"`
    Age       int
    CreatedAt time.Time
}

// 建表/补列,只会新增不会删除,生产慎用
db.AutoMigrate(&User{})

4. 基础 CRUD

小步递进看四个方法,查询结果要用指针承接:

// 创建
db.Create(&User{Name: "zhang", Email: "z@example.com", Age: 18})

// 查询:按主键、按条件
var u User
db.First(&u, 1)                       // WHERE id = 1
db.First(&u, "email = ?", "z@example.com")

// 更新:Save 全量写,Updates 只写指定列
db.Model(&u).Updates(User{Age: 20})           // 注意零值字段不会写入
db.Model(&u).Updates(map[string]any{"age": 20})

// 删除:按主键删除;模型含 gorm.DeletedAt 时默认软删除
db.Delete(&u, 1)

Where("name = ?", name) 这类问号占位是参数化查询,能防 SQL 注入,切勿用字符串拼接条件。

注意点

  • 模型含 gorm.DeletedAt 字段时删除默认是软删除,db.Unscoped() 才是物理删除。
  • Updates 传结构体时零值(0、"")不会写入,想写零值请用 map[string]any
  • AutoMigrate 只增不删(列、索引),线上表结构变更建议走专门的迁移工具。
  • gorm.Open 成功不代表已连上 MySQL,首个 SQL 才真正建立连接,可先 db.Exec("SELECT 1") 自检。

小结

GORM v2 的核心是「结构体即模型 + 链式查询 + 参数化条件」。先跑通连接与 CRUD,后续章节的关联、事务、分页都会复用同一套模型。更完整的 API(钩子、作用域、批量插入等)见官方文档 gorm.io。

笔记加载中…