创建
创建
- 单独创建----db.Create(&模型)
- 指定字段----在Create之前使用Select
- 跳过字段----在Create之前使用Omit
- 批量创建----db.Create(&[]模型)
type User struct { gorm.Model Name string Age uint8 `gorm:"comment:年龄"` } func main() { db, _ := gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"}), &gorm.Config{}) db.AutoMigrate(&User{}) user := User{ Name: "wxf", Age: 20, } //单独创建 db.Create(&user) //指定字段,只创建name字段 db.Debug().Select("name").Create(&user) //跳过,忽略字段 db.Debug().Omit("name").Create(&user) //批量创建 sliU := make([]User, 0) db.Debug().Create(sliU) //返回一个*DB,这里面会返回错误,和影响的条数 dbres := db.Debug().Create(sliU) fmt.Println(dbres.Error, dbres.RowsAffected) }
查询
查询
- 接收返回值的形式
- Map Map[string]interface{} []Map[string]interface{}
- 结构体
- 返回多条,用切片接收
- 查询主键排序后的第一条 db.First
- 查询第一条(不排序) db.Take
- 查询主键排序后的最后一条 db.Last
- 条件
- 主键索引
- String条件 where
- Struct Map(可以加入一个有内容的结构体作为条件,也可以使用一个key为数据库表字段的map)
- 内联条件 省略where,直接在得到结果的First等后面写条件
- Select指定条件
- join后续会写
First 和 Last 会根据主键排序,分别查询第一条和最后一条记录。 只有在目标 struct 是指针或者通过db.Model() 指定 model 时,该方法才有效。 此外,如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序。 例如:
result := make(map[string]interface{}) db.Model(&User{}).First(&result) fmt.Println(result) var result User db.Model(&User{}).First(&result) fmt.Println(result)
主键检索:
//主键检索 dbres:=db.Model(&User{}).First(&result,22) errors.Is(dbres.Error,gorm.ErrRecordNotFound)
String条件
//Where db.Model(&User{}).Where("name=?", "wxf").First(&result) fmt.Println(result)
Struct & Map
//Struct & map db.Model(&User{}).Where(User{Name: "wxf"}).First(&result) db.Model(&User{}).Where(map[string]interface{}{"name":"wxf"}).First(&result) fmt.Println(result)
内联条件并且返回多条
var result []User db.Find(&result, "name=?", "wxf") db.Find(&result, User{Name: "wxf"}) db.Find(&result, map[string]interface{}{"name": "wxf"}) fmt.Println(result)
Select指定字段,Omit同理
var result []User db.Select("name").Where("name LIKE ?","%x%").Find(&result)
有时候一个User表中有100个字段,但是我只想要它的name和age字段,能否屏蔽别的字段呢?答案是可以的,但是因为UserInfo是我们定义的返回结构体,所以需要在Find前面指定是哪个表结构
type UserInfo struct { Name string Age int } var userinfo []UserInfo db.Model(&User{}).Find(&userinfo) fmt.Println(userinfo)
更新
更新
- update 更新一个字段
- updates 更新多个字段
- map :使用 map 更新多个属性,只会更新其中有变化的属性
- struct :当通过 struct 更新时,GORM 只会更新非零字段
- Save 无论如何都更新,包括零值
Save的批量更新
var users []User dbres := db.Where("name = ?", "wxf").Find(&users) for i := range users { users[i].Age = 21 } dbres.Save(&users)
updates
var users User db.Where("name=?", "wxf").First(&users).Updates(User{Name: "testWxf", Age: 18})
删除
删除
- 用法同Find First等
- 软删除:deleteat字段存在则会软删除
- Unscoped():硬删除,忽略软删除进行查询
var user User //存在delete at字段,软删除 db.Where("name=?", "wxf").First(&user).Delete(&user) //硬删除,跳过delete at字段的约束 db.Unscoped().Where("name=?", "wxf").First(&user).Delete(&user)
原生SQL
SQL 构建器
var user User var users []User db.Raw("update users set name=?", "hhh").Scan(&user) fmt.Println(user) db.Raw("select * from users").Scan(&users) fmt.Println(users)