Выбор ответа Middle SQLAlchemy 2.0 спрашивают часто обновлено

selectinload против joinedload

Вопрос

Что лучше подходит для загрузки коллекции User.orders у 500 пользователей?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: selectinload: второй запрос WHERE userid IN (...). JOIN по связи «ко многим» повторяет данные пользователя в каждой строке заказа, и при большом числе заказов результат раздувается, а limit в запросе режет строки, а не пользователей. selectinload делает отдельный запрос по списку id…

Варианты ответа

  1. joinedload: один запрос с JOIN эффективнее двух отдельных
  2. selectinload: второй запрос WHERE user_id IN (...)правильный ответ
  3. lazyload: заказы загрузятся по мере обращения
  4. noload плюс ручной запрос заказов в цикле

Разбор

JOIN по связи «ко многим» повторяет данные пользователя в каждой строке заказа, и при большом числе заказов результат раздувается, а limit в запросе режет строки, а не пользователей. selectinload делает отдельный запрос по списку id родителей. joinedload хорош для связей «к одному». lazyload вернёт N+1, а noload вообще не загрузит связь.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме