5.17学习的Gorm | 青训营笔记

102 阅读2分钟

Gorm

5.17学习了gorm,这里记录一下基本的增删改查的操作

github: gorm地址:github.com/go-gorm/gor…

添加数据

db.Create(&user)

func (db *DB) Create(value interface{}) (tx *DB) 创建插入值,在值的 id 中返回插入数据的主键

指定字段插入,使用select函数

db.Select("username", "password").Create(&user)

忽略字段,使用omit函数

db.Omit("username").Create(&user)

批量插入,传入切片即可

使用 CreateInBatches 分批创建时,你可以指定每批的数量,例如:

var users = []User{{Username: "jinzhu_1"}, ...., {Username: "jinzhu_10000"}}
// 数量为 100
db.CreateInBatches(users, 100)

更新数据

func (db *DB) Save(value interface{}) (tx *DB) 将更新值保存在数据库中。如果值不包含匹配的主键,则插入值 类似mybatis-plus中的saveOrUpdate

goods := Goods{}
DB.Where("id = ?", 1).Take(&goods)

goods.Price = 100
//UPDATE `goods` SET `title`='毛巾',`price`=100.000000,`stock`=100,`type`=0,`create_time  `='2022-11-25 13:03:48' WHERE `id` = 1
DB.Save(&goods)

更新单列 Update(column string, value interface{})指定字段,可以传入结构体进行更新

更新多列 Updates(values interface{})

删除数据

根据id,第一行通过结构体中的值,第二行根据Where函数指定

DB.Delete(&goods)
_ = getDB().Where("id", 1).Delete(&User{})

查询数据

  • Take:查询一条记录
db.Take(&goods)
  • First: 根据主键正序排序后,查询第一条数据
db.First(&goods)
  • Last:根据主键倒序排序后,查询最后一条记录
db.Last(&goods)
  • Find:查询多条记录
db.Find(&goods) 
  • 查一条可以加Limit(1)
  • 查不到返回空不报错
  • Pluck:查询一列值
var titles []string
db.Model(&Goods{}).Pluck("title", &titles)

当 First、Last、Take 方法找不到记录时,GORM 会返回 ErrRecordNotFound 错误,可以通过对比gorm.ErrRecordNotFound进行判断,或者使用Find和Limit的组合进行查询。

db.Limit(1).Find(&user)

直接执行sql语句

因为sql语句使用了一个问号(?)作为绑定参数, 所以需要传递一个绑定参数(Raw第二个参数)。 Raw函数支持绑定多个参数

sql := "SELECT type, count(*) as  total FROM `goods` where create_time > ? GROUP BY type HAVING (total > 0)"
db.Raw(sql, "2022-11-06 00:00:00").Scan(&results)
fmt.Println(results)