网站首页 > 文章精选 正文
来源:械说
GORM是 Go 语言最流行的 ORM 框架,封装了 database/sql,支持自动迁移、关联关系、事务等功能,开发体验接近于高层语言的 ORM。
一、安装与初始化1. 安装 GORM 及数据库驱动go get -u gorm.io/gormgo get -u gorm.io/driver/mysql# PostgreSQL 用户:# go get -u gorm.io/driver/postgres2. 建立数据库连接packagemainimport("gorm.io/driver/mysql""gorm.io/gorm""log")funcmain { dsn :="user:password@tcp(127.0.0.1:3306)/gormdb?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})iferr !=nil{ log.Fatal("连接数据库失败:", err) } log.Println("连接成功")}
二、定义模型结构体typeUserstruct{ IDuint`gorm:"primaryKey"`NamestringEmailstring`gorm:"uniqueIndex"`AgeintCreatedAt time.Time}
- o 使用 GORM 标签配置字段属性。
- o 支持自动创建 id、created_at 等字段。
三、自动迁移表结构db.AutoMigrate(&User{})
会自动创建表,如果表存在则进行字段比对与升级(非破坏性)。
四、基本 CRUD 操作1. 新增数据user := User{Name:"Alice", Email:"alice@example.com", Age:25}db.Create(&user)fmt.Println("新ID:", user.ID)2. 查询数据varuser Userdb.First(&user,1)// 主键查询db.First(&user,"email = ?","alice@example.com")// 条件查询
- o First:查询一条
- o Find:查询多条
- o Where 支持链式调用:
varusers Userdb.Where("age > ?",20).Order("age desc").Limit(10).Find(&users)3. 更新数据db.Model(&user).Update("Name","Alice Updated")db.Model(&user).Updates(User{Name:"NewName", Age:28})// 多字段4. 删除数据db.Delete(&user)
五、条件构造器
GORM 支持各种链式条件语句:
db.Where("name LIKE ?","%alice%").Find(&users)db.Where("age BETWEEN ? AND ?",20,30).Find(&users)db.Not("name = ?","Bob").Find(&users)
六、钩子函数(Hooks)
你可以定义方法拦截模型的创建、更新、删除行为:
func(u *User) BeforeCreate(tx *gorm.DB) (errerror) { u.Name ="【新建】"+ u.Namereturn}
七、事务处理err := db.Transaction(func(tx *gorm.DB)error{iferr := tx.Create(&User{Name:"TxUser"}).Error; err !=nil{returnerr }iferr := tx.Delete(&User{},1).Error; err !=nil{returnerr }returnnil})
八、日志与调试
GORM 支持 SQL 日志:
import"gorm.io/gorm/logger"db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info),})
九、常用配置项
- 配置
- 说明
- Create, First, Find, Delete, Update基础 CRUD
- Where, Order, Limit, Offset链式构造条件
- AutoMigrate自动建表/更新表结构
- Model(&Model{})设置操作对象
十、小结
- 功能
- 示例
- 创建表db.AutoMigrate(&User{})
- 插入db.Create(&user)
- 查询db.First, db.Where.Find
- 更新db.Model.Updates
- 删除db.Delete(&user)
- 事务db.Transaction(func)
猜你喜欢
- 2025-07-14 Go并发编程之WaitGroup(go语言 并发)
- 2025-07-14 golang企业微信告警(企业微信告警推送)
- 2025-07-14 2.8 Go语言中的for循环,break和continue
- 2025-07-14 Go语言Context包:最常用包之一的使用指南
- 2025-07-14 Go语言零到一:动态数组——切片(go语言的切片)
- 2025-07-14 2025-06-26:转换数组。用go语言,给你一个整数数组 nums,它被视
- 2025-07-14 go sync.Pool简介(go system)
- 2025-07-14 2025-07-13:统计特殊子序列的数目。用go语言,给定一个只包含正
- 2025-07-14 2025-06-28:长度可被 K 整除的子数组的最大元素和。用go语言,给
- 2025-07-14 Go语言零到一:初识变量(go语言示例)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (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)
- fmt.println (52)