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。