Выбор ответа Middle SQLAlchemy 2.0 спрашивают часто обновлено
selectinload против joinedload
Вопрос
Что лучше подходит для загрузки коллекции User.orders у 500 пользователей?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: selectinload: второй запрос WHERE userid IN (...). JOIN по связи «ко многим» повторяет данные пользователя в каждой строке заказа, и при большом числе заказов результат раздувается, а limit в запросе режет строки, а не пользователей. selectinload делает отдельный запрос по списку id…
Варианты ответа
joinedload: один запрос с JOIN эффективнее двух отдельныхselectinload: второй запросWHERE user_id IN (...)правильный ответlazyload: заказы загрузятся по мере обращенияnoloadплюс ручной запрос заказов в цикле
Разбор
JOIN по связи «ко многим» повторяет данные пользователя в каждой строке заказа, и при большом числе заказов результат раздувается, а limit в запросе режет строки, а не пользователей. selectinload делает отдельный запрос по списку id родителей. joinedload хорош для связей «к одному». lazyload вернёт N+1, а noload вообще не загрузит связь.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.