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方法支持struct(默认情况下只会更新非零值的字段)和map[string]interface{}参数(默认情况下更新所有指定字段,即使是零值) 
err = db.Model(&Student{}).Where("id = ?", 4).Updates(ctx, map[string]interface{}{"name": "abc", "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。

posted on 2024-12-31 21:52  王景迁  阅读(33)  评论(0)    收藏  举报

导航