GORM增删改查
一、增
- 单:传入实例即可
user := &User{Name: "XX"} db.Create(user)
- 列表:
users := []User{{Name: "xx"},{Name: "XX1"},{Name: "XX2"}} db.Create(&users)
- 字典
db.Model(&User{}).Create([]map[string]interface{}{{"Name": "WW" },{"Name":"WW1"}})
Create还有钩子函数:BeforeSave
、BeforeCreate
、AfterSave、AfterCreate
二、删
- 单个删除必须带ID,否则会触发批量删除
user := User{Name: "XX", ID: 1} db.Delete(&user)
id删除
db.Delete(&User{}, 2)
- 条件删除
db.Where( "name = ?" , "XX" ).Delete(&user)
- 批量删除
db.Delete(User{}, "name LIKE ?" , "%xx%" )
删除的钩子函数:
BeforeDelete
,AfterDelete
三、改
- 根据ID更改
user := User{ID: 3} db.Model(&user).Update("name", "test")
db.Model(&User{}).Where("id=?", 4).Update("name", "test2")
Model传的是实例,就可以直接操作,传的是结构体本身的话,需要再加条件之后进行操作,当然传的是实例也可以进一步过滤。
- 批量更改
db.Model(&User{}).Where("name LIKE ?", "test").Update("name", "test2")
更改的钩子函数:
BeforeSave
,BeforeUpdate
,AfterSave
,AfterUpdate
四、查
user := User{}
-
// 获取按主键排序的第一条记录
db.First(&user) -
// 获取最后一条记录,按主键排序 desc
db.Last(&user) -
根据ID查询:db.First(&user, 10 )
// SELECT * FROM users WHERE id = 10;user := User{} fmt.Print(user) db.First(&user) fmt.Print(user) //查询后的结果
- 返回所有数据:
var user []User db.Find(&user)
也可以添加条件
var user []User db.Find(&user, "id = 3") fmt.Print(user)
也可以用where
# 写法 1 写死数据
var user []User //db.Find(&user, "id = 3") db.Where("id = ?", "3").Find(&user) fmt.Print(user)# 写法2 更灵活
var user []User //db.Not("id = ?", "3").Find(&user) db.Where(&User{Name: "xx"}).Find(&user) fmt.Print(user) -
where的参数是查询的具体条件,但是需要用FInd指明查的哪个库,如果单独用find,第二个参数传的是查询条件,最好使用先where后find这种形式。因为后续有复杂查询,where更适合。
- NOT
var user []User db.Not("id = ?", "3").Find(&user) fmt.Print(user)
Not In
db.Not( map [ string ] interface {}{ "name" : [] string { "xx" , "xx2" }}).Find(&user)
In
db.Where( "name IN ?" , [] string { "xx" , "xx2" }).Find(&users)
Not In id_list
db.Not([] int64 { 1 , 2 , 3 }).Find(&user)
- OR 通常和where一起使用
var user []User db.Where("id", "4").Or("id", "3").Find(&user) fmt.Print(user)
var user []User db.Where(&User{ID: 4}).Or(&User{ID: 3}).Find(&user) fmt.Print(user)
- and
var user []User db.Where("id =? AND name = ?", "3", "test2").Find(&user) fmt.Print(user)
var user []User db.Where(map[string]interface{}{"name": "test2", "id":"3"}).Find(&user) fmt.Print(user)
- 指定具体字段
var user []User db.Select("name").First(&user) fmt.Print(user)
- 排序
var user []User db.Order("name desc").Find(&user) fmt.Print(user)
var user []User db.Order("name desc").Order("id desc").Find(&user) fmt.Print(user)
- limit 和offset
db.Limit( 10 ).Offset( 5 ).Find(&user)
- count
var user []User var count int64 db.Where("name", "test2").Find(&user).Count(&count) fmt.Print(user, count)
过滤字段重复
var user []User var count int64 db.Where("name", "test2").Distinct("name").Find(&user).Count(&count) fmt.Print(user, count)