如何使用 Gorm 预加载
How to preload with Gorm
我遇到了预加载和关联的障碍
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
并为我填写模型..
我是不是做错了什么?
不幸的是,这正是 GORM 处理预加载的方式。
go-pg 的查询稍好一些,但没有与 GORM 相同的功能。在某些情况下它仍然会进行多次查询。
老实说,我建议仅将 query building 与原始 SQL 一起使用,尤其是当您知道模型在编译时的外观时。我最终在我的项目中采用了这种方法,尽管事实上我并不知道我的模型会是什么样子。
可以试试Joins(),可以在SQL
中执行JOIN语法
我遇到了预加载和关联的障碍
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
并为我填写模型..
我是不是做错了什么?
不幸的是,这正是 GORM 处理预加载的方式。
go-pg 的查询稍好一些,但没有与 GORM 相同的功能。在某些情况下它仍然会进行多次查询。
老实说,我建议仅将 query building 与原始 SQL 一起使用,尤其是当您知道模型在编译时的外观时。我最终在我的项目中采用了这种方法,尽管事实上我并不知道我的模型会是什么样子。
可以试试Joins(),可以在SQL
中执行JOIN语法