Как предварительно загрузить с Gorm - PullRequest
0 голосов
/ 02 января 2019

Я бью дорожный блок с предварительной загрузкой и ассоциациями

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

И заполните модель для меня ..

Я делаю что-то явно неправильно или?

1 Ответ

0 голосов
/ 03 января 2019

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

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

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

...