我在预加载和关联方面遇到障碍
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
然后为我填写模型..
我是在做明显地错误的事情吗?
答案 0 :(得分:1)
不幸的是,这只是GORM处理预加载的方式。
go-pg的查询稍好一些,但功能与GORM不同。在某些情况下,它仍然会执行多个查询。
老实说,我建议仅将query building与原始SQL一起使用,特别是如果您知道模型在编译时的样子的话。尽管我不知道我的模型看起来会是什么样,但最终我还是在项目中使用了这种方法。
答案 1 :(得分:0)
可以尝试使用here,它可以在SQL中执行JOIN语法