Как предварительно загрузить с 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

И залейте мне модель ..

Я что-то делаю явно не так или?


person gambol    schedule 02.01.2019    source источник


Ответы (2)


К сожалению, именно так GORM обрабатывает предварительную загрузку.

go-pg имеет несколько лучшие запросы, но не обладает той же функциональностью, что и GORM. В некоторых случаях он по-прежнему будет выполнять несколько запросов.

Я честно рекомендую просто использовать построение запросов с необработанным SQL, особенно если вы знаете как будут выглядеть ваши модели во время компиляции. В конечном итоге я использовал этот подход в своем проекте, несмотря на то, что я не знал, как будут выглядеть мои модели.

person robbieperry22    schedule 02.01.2019

Можно попробовать Joins (), который может выполнять синтаксис JOIN в SQL.

person yulin_zou    schedule 24.11.2020