【问题标题】:How to preload with Gorm如何使用 Gorm 进行预加载
【发布时间】:2019-01-02 18:55:58
【问题描述】:

我在预加载和关联方面遇到了障碍

type Entity struct {
  ID           uint `gorm:"primary_key"`
  Username     string
  Repositories []*Repository `gorm:"many2many:entity_repositories"`
}

type Repository struct {
  ID       uint `gorm:"primary_key"`
  Name     string
  Entities []*Entity `gorm:"many2many:entity_repositories"`
} 

对于小用户数,使用下面的预加载很好

 db.Preload("Repositories").Find(&list)

也试过了

 db.Model(&User{}).Related(&Repository{}, "Repositories").Find(&list)

预加载似乎是 select * entities,然后是使用 SELECT * FROM "repositories" INNER JOIN "entity_repositories" ON "entity_repositories"."repository_id" = "repositories"."id" WHERE ("entity_repositories"."entity_id" IN ('1','2','3','4','5','6','7','8','9','10')) 的内部连接

随着用户数量的增加,这不再是可维护的,因为它达到了 sqlite 限制 (dev)。我已经尝试了许多排列! ..实际上我想我只是想让它做一些类似的事情

SELECT entities.*, repositories.*  
FROM entities 
JOIN entity_repositories ON entity_repositories.entity_id = entities.id
JOIN repositories ON repositories.id = entity_repositories.repository_id
ORDER BY entities.id

并为我填写模型..

我是在做一些明显错误的事情吗?

【问题讨论】:

    标签: database go go-gorm preloading


    【解决方案1】:

    不幸的是,这正是 GORM 处理预加载的方式。

    go-pg 的查询稍好一些,但没有 GORM 相同的功能。在某些情况下,它仍然会执行多个查询。

    我真诚地建议将query building 与原始 SQL 一起使用,特别是如果您知道您的模型在编译时会是什么样子。我最终在我的项目中采用了这种方法,尽管我不知道我的模型会是什么样子。

    【讨论】:

      【解决方案2】:

      可以试试Joins(),它可以在SQL中执行JOIN语法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2020-01-06
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多