gorm crud总结
type Student struct {
Id int64 `gorm:"primary_key"`
Name string `gorm:"column:name"`
Age int `gorm:"column:age"`
}
func (Student) TableName() string {
return "student"
}
插入
s := Student{Name: "abc", Age: 17,}
err = db.Model(&Student{}).Create(&s).Error
更新
# 更新单列
err = db.Model(&Student{}).Where("id = ?", 4).UpdateColumn("age", 0).Error
# 不同于Updates方法,Save方法支持全字段更新,即使字段值是零值
s := Student{Id: 1, Name: "abc", Age: 17,}
s.Age = 0
err = db.Save(&s).Error
删除
# 根据主键删除
s := Student{Id: 1, Name: "abc", Age: 17,}
err = db.Delete(&s).Error
# 根据非主键条件删除
err = db.Delete(&Student{}, "name = ?", "abc").Error
# 删除单张表所有记录
err = db.Exec(fmt.Sprintf("delete from %s", tableName)).Error
查询
# 查询单条记录
var s1 Student
err = db.Model(&Student{}).Where("id = ?", 2).First(&s1).Error
# 查询多条记录
var s1 []Student
err = db.Model(&Student{}).Find(&s1).Error
# 查询某列
var age int
err = db.Model(&Student{}).Select("age").Where("id = ?", 2).Scan(&age).Error
# 计数
var count int64
err = db.Model(&Student{}).Count(&count).Error
特殊场景
使用First、Last 2种查询方法之一,如果查询结果为空,那么不管是否使用切片接收,都会报错gorm.ErrRecordNotFound。
使用Find、Scan 2种查询方法之一,如果查询结果为空,接收结果类型是切片,那么不会报错gorm.ErrRecordNotFound,需要判断切片长度是否为0。