本文章为自己在基于课程视频时学习Gorm所得心得体会,本人拙见,若有不足之处,还请各位多多指出。
1. 什么是Gorm
Gorm(全称:Go Object Relational Mapping)是一个针对 Go 语言的对象关系映射(ORM)库。ORM 是一种编程技术,用于在关系型数据库和编程语言对象之间建立映射关系,使开发者能够使用面向对象的方式操作数据库,而不必直接编写 SQL 查询语句。
Gorm 在 Go 语言中提供了一种简化数据库操作的方式,它允许开发者定义结构体来表示数据库表格,然后通过 Gorm 提供的方法进行数据库的增、删、改、查操作,而无需手动编写 SQL 语句。Gorm 支持多种数据库后端,如 MySQL、PostgreSQL、SQLite 等。
Gorm 的主要特点包括:
- 模型定义:通过定义 Go 结构体来映射数据库表格,可以指定字段的名称、数据类型、主键、索引等属性。
- 查询构建:Gorm 提供了丰富的查询构建方法,可以轻松地构造复杂的查询条件和排序规则,从而减少手写 SQL 查询的工作量。
- 事务支持:Gorm 支持事务操作,可以确保数据库操作的原子性和一致性。
- 预加载和延迟加载:可以通过预加载相关联的数据来优化查询性能,同时支持延迟加载以避免不必要的数据加载。
- 钩子函数:可以在模型的不同生命周期阶段注册回调函数,实现自定义的业务逻辑。
- 迁移工具:Gorm 提供了数据库迁移工具,可以自动同步数据库表结构和代码定义的模型。
- 插件扩展:可以通过插件扩展 Gorm 的功能,例如添加缓存支持、审计日志等。
2. 如何使用Gorm
Gorm的使用方式十分简单,只需要简单的几步操作即可进入CRUD的世界。
2.1. 下载gorm库
最简单的方式就是直接使用命令下载安装Gorm
go get -u github.com/jinzhu/gorm
当然,在有了go mod
后,可以让其自动添加gorm的依赖包,也可以手动自行添加
更多相关操作可以参看go-demo
的项目DMinerJackie/go-demo: go to go (github.com)
2.2. 数据库连接
使用grom创建数据库连接
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "root:root@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
if err!= nil{
panic(err)
}
defer db.Close()
}
2.3. 定义模型
定义自己的数据模型,以映射到 MySQL 数据库表格和操作数据。以下是一个关注模块的简单例子
type Follow struct {
UserID int64 // 关注人ID
FollowerID int64 // 被关注人ID
CreateAt time.Time // 关注发起时间
Status int8 // 关注状态(1:关注,默认0)
}
2.4. 创建表
对于表的创建,可以直接通过 db.CreateTable
创建表了,非常方便,还可以通过 db.Set
设置一些额外的表属性
if !db.HasTable(&Follow{}) {
if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Follow{}).Error; err != nil {
panic(err)
}
}
2.5. 插入
先构造已给对象,直接调用 db.Create() 就可以插入一条记录了
follow := model.Follow{
UserID: userId,
FollowerID: targetId,
CreateAt: date,
}
if err := config.DB.Select("UserId", "FollowerId", "CreateAt").Create(&follow).Error; nil != err {
log.Println(err.Error())
return false, err
}
2.6. 删除
先用 db.Where() 构造查询条件,再调用 db.Delete() 就可以删除
if err := db.Where(&Follow{Hash: hash}).Delete(Follow{}).Error; err != nil {
eturn err
}
2.7. 修改
Gorm
更新数据是通过Update
函数操作的,Update
函数需要传入要更新的字段和对应的值。
需要通过Model
函数来传入要更新的模型,主要是用来确定表名,也可以使用Table
函数来确定表名。
result := db.Model(&Follow{}).Where("UserID = ?", "1").Update("UserID", "2")
if result.Error != nil {
log.Fatal(result.Error)
} else {
log.Printf("Updated records: %d\n", result.RowsAffected)
}
2.8. 查询
先用 db.Model()
选择一个表,再用 db.Where()
构造查询条件,后面可以使用 db.Count()
计算数量,如果要获取对象,可以使用 db.Find(&Follow)
或者只需要查一条记录 db.First(&Follow)
var count int
err := db.Model(&Follow{}).Where(&Follow{UserId: uid, FollowerId: fid}).Count(&count).Error
if err != nil {
return false, err
}
3. 总结
至此,gorm的简单增删改查操作就已经介绍完了,gorm作为一款orm库,几乎满足了一个CRUDer的一切想象,实现灵活,花样繁多。
有了gorm,就不需要再在代码中维护sql语句了。这值得我们深入学习,而课上所述的更多底层的高级操作,还有待后续课程的学习掌握,本篇文章仅供抛砖引玉,期待更多的大佬一起来学习交流。