GORM增删查改 | “朝闻道”知识分享大赛

ao_ao66 2023-12-31 15:01:33

这是我参加朝闻道知识分享大赛的第 6 篇文章

增删查改

创建(增加)

创建记录(数据行)

使用db.Create()
创建一条数据:

img

运行后可以发现db1数据库中出现了表user_infos,表里也有一条我们创建的数据

img

同样可以用Create创建多条数据:

img

Upsert和冲突

使用clause.OnConflict处理数据冲突

img

默认值

通过使用defalut标签为字段定义默认值

img

删除

物理删除

删除一条记录时,删除对象需要指定主键,否则会触发批量删除,删除所有匹配的记录。

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 "%小红%";

删除操作前:

img

删除一条id为1的记录后:

img

批量删除名字为“小红”的记录后:

img

软删除

GORM提供了gorm.DeletedAt用于帮助用户实现软删除。拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除。但GROM会将DeleteAt置为当前时间,并且不能通过正常的查询方法找到该记录。
使用Unscoped可以查询到被软删的数据。

查询

GORM提供了FirstTakeLast方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1条件,且没有找到记录时,它会返回ErrRecordNotFound错误

img

运行结果:

img

选择特定字段查询:Select允许指定要从数据库中检索的字段,否则将默认选择所有字段。
tips:

  1. 如果想避免ErrRecordNotFound错误,可以使用Find,比如db.Limit(1).Find(&user)Find方法可以接受struct和slice的数据。对单个对象使用Find而不带limit,db.Find(&user)将会查询整个表并且只返回第一个对象,这是性能不高并且不确定的。
  2. 使用结构体作为条件查询时,GORM只会查询非零值字段。如果字段值为0、''、false或其他零值,该字段将不会被用于构建查询条件。要在查询条件中包含零值可以使用Map来构建查询条件。

修改(更新)

  • Save会保存所有的字段,即使字段是零值。Save是一个组合函数。如果保存值不包含主键,它将执行Create,否则它将执行包含所有字段的Update。但是Save会更新 struct中全部的字段,未赋值的字段使用零值来更新,这样极易覆盖数据库中原有的值。
  • 使用Struct更新:使用示例:db.Model(&user).Updates(UserInfo{...}),只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。
  • 使用Map更新:使用示例:db.Model(&user).Updates(map[string]interface{}{...})
  • 如果想更新指定字段,可以使用SelectOmit

使用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;
...全文
75 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

857

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧