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)