GORM 入门指南
第一章:GORM 入门指南
1.1 GORM 简介
GORM 是 Go 语言中最流行的 ORM 库之一,全称为 Go Object Relational Mapping。它由 Jinzhu 开发并维护,提供了简洁优雅的 API 来操作数据库。
GORM 的核心特性
| 特性 | 说明 |
|---|---|
| 全功能 ORM | 支持关联(一对一、一对多、多对多)、钩子、预加载、连接池等 |
| 链式操作 | 流畅的查询构建器 API |
| 自动迁移 | 根据模型自动创建/更新数据库表结构 |
| 通用数据库支持 | MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等 |
| 可扩展性 | 基于 GORM 编写插件,如 Prometheus 监控、锁机制等 |
| 上下文支持 | 完整支持 context.Context |
GORM 版本
- GORM v1: 第一个稳定版本,已停止维护
- GORM v2: 当前主流版本,完全重写,性能更好(推荐)
1.2 环境准备
安装 Go
确保 Go 版本 >= 1.16:
go version
安装 GORM
go get -u gorm.io/gorm
安装数据库驱动
根据你使用的数据库选择对应的驱动:
# MySQL
go get -u gorm.io/driver/mysql
# PostgreSQL
go get -u gorm.io/driver/postgres
# SQLite
go get -u gorm.io/driver/sqlite
# SQL Server
go get -u gorm.io/driver/sqlserver
1.3 第一个 GORM 程序
项目结构
hello-gorm/
├── go.mod
├── main.go
└── models/
└── user.go
初始化项目
mkdir hello-gorm
cd hello-gorm
go mod init hello-gorm
定义模型
package models
import "gorm.io/gorm"
type User struct {
gorm.Model // 内嵌基础字段:ID, CreatedAt, UpdatedAt, DeletedAt
Name string // 默认字段类型 varchar(191)
Email string `gorm:"uniqueIndex"` // 唯一索引
Age int
}
完整示例代码
package main
import (
"log"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type User struct {
gorm.Model
Name string
Email string `gorm:"uniqueIndex"`
Age int
}
func main() {
// 1. 连接数据库(使用 SQLite 内存模式)
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info), // 打印 SQL 日志
})
if err != nil {
log.Fatal("数据库连接失败:", err)
}
// 2. 自动迁移表结构
db.AutoMigrate(&User{})
// 3. 创建记录
user := User{Name: "张三", Email: "zhangsan@example.com", Age: 25}
result := db.Create(&user)
if result.Error != nil {
log.Fatal("创建失败:", result.Error)
}
log.Printf("插入记录数: %d, 新记录 ID: %d", result.RowsAffected, user.ID)
// 4. 查询记录
var found User
db.First(&found, user.ID)
log.Printf("查询结果: %+v", found)
// 5. 更新记录
db.Model(&found).Update("Age", 26)
// 6. 删除记录
db.Delete(&found)
log.Println("操作完成!")
}
运行程序
go run main.go
预期输出:
2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] INSERT INTO `users` ...
2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] SELECT * FROM `users` ...
2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] UPDATE `users` SET ...
2024/xx/xx xx:xx:xx main.go:xx
[0.0ms] [rows:1] UPDATE `users` SET `deleted_at`=...
插入记录数: 1, 新记录 ID: 1
查询结果: {Model:{ID:1 ...} Name:张三 Email:zhangsan@example.com Age:25}
操作完成!
1.4 核心概念速览
模型(Model)
GORM 使用 Go 结构体定义数据库表结构。每个结构体对应一张表,每个字段对应一列。
type Product struct {
Code string
Price uint
}
约定优于配置
| 约定 | 说明 |
|---|---|
| 表名 | 结构体名的复数形式(User → users) |
| 主键 | 名为 ID 的字段 |
| 列名 | 字段名的蛇形小写(UserName → user_name) |
| 创建时间 | CreatedAt 字段 |
| 更新时间 | UpdatedAt 字段 |
| 删除时间 | DeletedAt 字段(软删除) |
数据库操作链
db // *gorm.DB 实例
.Model(&User{}) // 指定模型
.Where(...) // 添加条件
.Find(&users) // 执行查询
1.5 练习题
- 修改示例,使用 MySQL 连接本地数据库
- 给 User 模型添加 Phone 字段(手机号,唯一索引)
- 尝试批量创建 3 个用户记录
1.6 小结
本章介绍了 GORM 的基本概念,并完成了第一个完整的 CRUD 程序。接下来我们将深入探讨模型定义的更多细节。
本文代码地址:https://github.com/LittleMoreInteresting/gorm_study
欢迎关注公众号,一起学习进步!