如何预装Gorm

时间:2019-01-02 18:55:58

标签: database go go-gorm preloading

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

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

然后为我填写模型..

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

2 个答案:

答案 0 :(得分:1)

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

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

老实说,我建议仅将query building与原始SQL一起使用,特别是如果您知道模型在编译时的样子的话。尽管我不知道我的模型看起来会是什么样,但最终我还是在项目中使用了这种方法。

答案 1 :(得分:0)

可以尝试使用here,它可以在SQL中执行JOIN语法