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

Ленивая загрузка связей

Вопрос

Как по умолчанию загружается связь user.orders, объявленная через relationship()?

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

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

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

Коротко

Правильный ответ: Лениво: отдельный SELECT при первом обращении. Стратегия по умолчанию lazy="select": связь не грузится, пока к ней не обратились, а потом выполняется отдельный запрос.

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

  1. JOIN в основном запросе при загрузке пользователя
  2. Никак: связь пустая, пока не вызвать session.load()
  3. При старте приложения для всех пользователей разом
  4. Лениво: отдельный SELECT при первом обращенииправильный ответ

Разбор

Стратегия по умолчанию lazy="select": связь не грузится, пока к ней не обратились, а потом выполняется отдельный запрос. В цикле по пользователям это даёт N+1. Стратегию меняют в relationship(lazy=...) или, лучше, в конкретном запросе через .options(selectinload(...)).

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

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

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