Проверяет понимание стратегий жадной загрузки связанных сущностей в SQLAlchemy для оптимизации запросов к базе данных.
В SQLAlchemy при работе с ORM часто требуется загрузить связанные сущности, чтобы избежать проблемы N+1 запросов. Для этого используются стратегии жадной загрузки (eager loading). Две популярные стратегии — joinedload и selectinload.
joinedload выполняет один SQL-запрос с использованием JOIN для загрузки основной и связанной сущности. Это может быть эффективно, если связей немного, но приводит к дублированию данных в результирующем наборе строк.
from sqlalchemy.orm import joinedload
users = session.query(User).options(joinedload(User.addresses)).all()
# SQL: SELECT * FROM users LEFT OUTER JOIN addresses ON users.id = addresses.user_idselectinload сначала загружает основные объекты, а затем выполняет отдельный запрос с использованием IN для загрузки связанных объектов. Это часто быстрее при большом количестве связей, так как избегает дублирования строк.
from sqlalchemy.orm import selectinload
users = session.query(User).options(selectinload(User.addresses)).all()
# SQL: SELECT * FROM users
# Затем: SELECT * FROM addresses WHERE user_id IN (1, 2, 3, ...)Выбор стратегии зависит от конкретной ситуации и структуры данных. В большинстве случаев selectinload предпочтительнее для коллекций, а joinedload — для одиночных связей.