1,037
社区成员




这是我参加朝闻道知识分享大赛的第 6 篇文章
使用db.Create()
创建一条数据:
运行后可以发现db1数据库中出现了表user_infos,表里也有一条我们创建的数据
同样可以用Create
创建多条数据:
使用clause.OnConflict
处理数据冲突
通过使用defalut
标签为字段定义默认值
删除一条记录时,删除对象需要指定主键,否则会触发批量删除,删除所有匹配的记录。
db.Delete(&UserInfo{}, 1)
//删除一条id为1的记录 DELETE FROM user_infos WHERE id = 1;
db.Where("Name LIKE ?", "%小红%").Delete(&UserInfo{})
//批量删除名字为“小红”的记录 DELETE from emails where email LIKE "%小红%";
删除操作前:
删除一条id为1的记录后:
批量删除名字为“小红”的记录后:
GORM提供了gorm.DeletedAt
用于帮助用户实现软删除。拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除。但GROM会将DeleteAt置为当前时间,并且不能通过正常的查询方法找到该记录。
使用Unscoped
可以查询到被软删的数据。
GORM提供了First
、Take
、Last
方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1
条件,且没有找到记录时,它会返回ErrRecordNotFound
错误
运行结果:
选择特定字段查询:Select允许指定要从数据库中检索的字段,否则将默认选择所有字段。
tips:
ErrRecordNotFound
错误,可以使用Find
,比如db.Limit(1).Find(&user)
,Find
方法可以接受struct和slice的数据。对单个对象使用Find而不带limit,db.Find(&user)
将会查询整个表并且只返回第一个对象,这是性能不高并且不确定的。Save
会保存所有的字段,即使字段是零值。Save
是一个组合函数。如果保存值不包含主键,它将执行Create
,否则它将执行包含所有字段的Update
。但是Save
会更新 struct中全部的字段,未赋值的字段使用零值来更新,这样极易覆盖数据库中原有的值。使用示例:db.Model(&user).Updates(UserInfo{...})
,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。使用示例:db.Model(&user).Updates(map[string]interface{}{...})
Select
、Omit
使用Map更新选定字段 举例:
// Select with Map
// 要修改的用户ID为`1`:
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "zhangsan", "hobby": "篮球"})
// UPDATE user_infos SET name='张三',hobby='篮球' WHERE id=1;
db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "zhangsan", "hobby": "篮球"})
// UPDATE user_infos SET name='张三',hobby='篮球' WHERE id=1;