网站首页 > 文章精选 正文
1. 什么是 GORM?
GORM 是 Go 语言中最流行的 ORM(对象关系映射)库之一,由 jinzhu 开发并维护。它提供了简洁的 API,让开发者能够轻松地与关系型数据库(如 MySQL、PostgreSQL、SQLite)交互,而无需编写复杂的 SQL 语句。
GORM 的核心优势:
支持多种数据库(MySQL、PostgreSQL、SQLite、SQL Server)
自动建表 & 迁移(AutoMigrate)
链式调用(Fluent API)
事务支持(Transaction)
关联查询(Preload、Joins)
钩子(Hooks)(BeforeCreate、AfterUpdate 等)
软删除(Soft Delete)
性能优化(缓存、批量插入)
2. 安装 GORM 和 MySQL 驱动
在开始之前,确保你已经安装了 Go(1.16+),然后运行以下命令安装 GORM 和 MySQL 驱动:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
3. 连接 MySQL 数据库
首先,我们需要创建一个数据库连接。以下是一个完整的 MySQL 连接示例:
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 配置 MySQL 连接字符串
dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
// 连接数据库
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("Failed to connect to database!")
}
// 自动迁移(建表)
db.AutoMigrate(&User{})
}
关键点解析
dsn 是 MySQL 连接字符串,包含用户名、密码、主机、端口、数据库名等信息。
AutoMigrate 会自动创建表结构(如果表不存在)。
4. 定义数据模型
GORM 使用结构体(Struct)来映射数据库表。例如,定义一个 User 表:
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Email string `gorm:"unique"`
Age int
CreatedAt time.Time // 自动记录创建时间
UpdatedAt time.Time // 自动记录更新时间
}
GORM 标签说明
标签 作用
primaryKey 主键
size:100 字段长度
unique 唯一约束
- 忽略该字段
default:value 默认值
5. CRUD 操作示例
(1) 创建记录(Create)
user := User{Name: "张三", Email: "zhangsan@example.com", Age: 25}
result := db.Create(&user) // 插入数据
if result.Error != nil {
panic("插入失败!")
}
fmt.Println("插入成功,ID:", user.ID)
(2) 查询记录(Read)
// 查询单条记录
var user User
db.First(&user, 1) // 查询 ID=1 的用户
db.First(&user, "name = ?", "张三") // 条件查询
// 查询多条记录
var users []User
db.Where("age > ?", 20).Find(&users) // 查询年龄 >20 的用户
(3) 更新记录(Update)
db.Model(&user).Update("Name", "李四") // 更新单个字段
db.Model(&user).Updates(User{Name: "王五", Age: 30}) // 更新多个字段
(4) 删除记录(Delete)
db.Delete(&user) // 硬删除(物理删除)
db.Where("age < ?", 18).Delete(&User{}) // 批量删除
6. 高级查询
(1) 预加载(Preload)
用于关联查询(避免 N+1 查询问题):
type Order struct {
ID uint
UserID uint
User User `gorm:"foreignKey:UserID"`
}
var orders []Order
db.Preload("User").Find(&orders) // 同时查询关联的 User 数据
(2) 事务(Transaction)
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 执行事务操作
if err := tx.Create(&user1).Error; err != nil {
tx.Rollback()
return
}
if err := tx.Create(&user2).Error; err != nil {
tx.Rollback()
return
}
tx.Commit() // 提交事务
(3) 软删除(Soft Delete)
type Product struct {
gorm.Model // 包含 ID, CreatedAt, UpdatedAt, DeletedAt
Name string
}
db.Delete(&product) // 软删除(记录仍存在,但 DeletedAt 有值)
db.Unscoped().Delete(&product) // 强制硬删除
7. 性能优化
(1) 批量插入
var users = []User{
{Name: "A", Age: 20},
{Name: "B", Age: 25},
}
db.CreateInBatches(users, 100) // 每批 100 条
(2) 索引优化
type User struct {
ID uint
Name string `gorm:"index"` // 单字段索引
Email string `gorm:"uniqueIndex"` // 唯一索引
}
(3) 查询缓存
var user User
db.Cache().First(&user, 1) // 使用缓存查询
8. 总结
GORM 是 Go 语言中最强大的 ORM 之一,它简化了数据库操作,支持事务、关联查询、软删除等高级功能。本文从安装、连接 MySQL、CRUD 操作到高级查询,全面介绍了 GORM 的使用方法。
适用场景
Web 开发(Gin、Echo、Fiber)
微服务(gRPC、K8s)
数据分析(批量处理)
如果你正在寻找一个高效、易用的 Go ORM 库,GORM 绝对是最佳选择!
进一步学习
GORM 官方文档
MySQL 官方文档
Go 语言数据库编程
希望这篇文章能帮助你快速掌握 GORM!如果有任何问题,欢迎在评论区交流!
猜你喜欢
- 2025-05-21 Zabbix7 keepalived VIP高可用部署 对接 OceanBase高可用集群
- 2025-05-21 PostgreSQL 技术内幕(五)Greenplum-Interconnect模块
- 2025-05-21 Windows深度解析: WSL 1 与 WSL 2 的核心差异及选择指南
- 2025-05-21 PostgreSQL技术大讲堂 - 第44讲:pg流复制部署
- 2025-05-21 小白入门必知必会-PostgreSQL-15.2源码编译安装
- 2025-05-21 什么是网络端口?或许工作10年的人也很难100%理解
- 2025-05-21 运维日记|postgresql-利剑出鞘-psql出手,天下我有
- 2025-05-21 Linux 防火墙怎么开?3 分钟学会放行 80 端口,再也不怕远程连接被拒
- 2025-05-21 PostgreSQL轻量级连接池 PgBouncer
- 2025-05-21 Docker安装与管理postgresql
- 05-22离线在docker镜像方式部署ragflow0.17.2
- 05-22【Docker 新手入门指南】第七章:镜像使用
- 05-22使用Docker制作OpenJDK镜像
- 05-22使用Dockerfile build镜像
- 05-22一文详解Docker轻量级虚拟化,镜像和容器
- 05-22三 docker 镜像命令
- 05-22Docker-使用Dockerfile 定制镜像
- 05-22Linux日常小技巧Docker打包
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)