创建
- 单独创建----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
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)