文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Gorm 中的 Preload 函数有什么作用?

2024-04-04 23:51

关注

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Gorm 中的 Preload 函数有什么作用?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

链接http://gorm.io/docs/preload.html讨论了gorm中的预加载,但我无法理解这个函数的作用。

type User struct {
  gorm.Model
  Username string
  Orders Order
}
type Order struct {
  gorm.Model
  UserID uint
  Price float64
}


db.Preload("Username")

db.Preload("Orders").Find(&users)

有人能解释一下这两个语句的作用吗?输出是什么?

难道是用preload来缓存结果的?


解决方案


您提供的链接显示了它的作用。您只需实际阅读页面上的信息即可。

首先,这并没有真正做任何事情:

db.preload("username")

另一方面,以下内容:

db.preload("orders").find(&users)

确实做了一些事情。首先,它填充 users,然后填充 []user.orders。在您链接的页面上的评论中,您会发现这一点,其中显示了它通过查询执行的操作:

db.preload("orders").find(&users)
//// select * from users;
//// select * from orders where user_id in (1,2,3,4);

那么这到底有什么作用呢?我可以为您提供技术答案,您可以通过谷歌搜索热切加载轻松找到该答案,或者我可以通过我认为更简单的示例为您提供答案。

让我通过示例来解释这一点。

假设您有用户,每个用户可以有多个订单。这是一对多的关系,可以这样定义:

type user struct {
  gorm.model
  username string
  orders []order
}

当您填充 users 切片时,如下所示:

db.find(&users)
//// select * from users;

如果您需要获取每个用户的所有订单,您可以轻松访问 user.orders 但无论如何它都是空的,因为它没有被填充。

如果我们像这样填充 users 切片:

db.preload("orders").find(&users)

user.orders 将由该用户的订单填充。这是一个使处理关系变得更容易的抽象。

丑陋的替代方案是:

db.find(&users)

for user := range users {
  db.where("user_id", user.id).find(&user.orders)
}

它还会向数据库发出不必要的更多请求。 (这不好)

如果您的用户有帖子、评论和订单,那么您可以像这样定义和查询它:

type User struct {
  gorm.Model
  Username string
  Orders []Order
  Comments []Comment
  Posts []Post
}

db.Preload("Orders").Preload("Comments").Preload("Posts").Find(&users)

只需上面的代码,您现在就可以访问数据库中不同表中的用户数据。

希望对您有所帮助。

理论要掌握,实操不能落!以上关于《Gorm 中的 Preload 函数有什么作用?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注编程网公众号吧!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯