Объединения и ленивая или жадная загрузка
Избегайте запросов N+1 при переходе по связям.
«Объединения и ленивая или жадная загрузка» — бесплатный урок Flask Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Flask Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Flask Academy содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Querying Across Tables
Sometimes you filter parents by their children's data. A join lets one query span two related tables at once. 🔀
Write a join
Call join() on a query to pull a related model in, then filter on either side as one combined query.
q = User.query.join(Post).filter(Post.title == "Hi")Filter on the Joined Table
After a join, conditions on the other model are fair game, so you find parents by what their children contain.
active = User.query.join(Post).filter(Post.public).all()Lazy Loading Is Default
By default relationships are lazy: the children load only the moment you actually touch that attribute.
user = User.query.first()
user.postsThe N+1 Problem
Looping over parents and reading children lazily fires one query per parent. This N+1 pattern quietly kills performance. 😬
for u in User.query.all():
print(len(u.posts))Eager Loading Fixes It
Eager loading grabs the related rows up front, so the whole graph loads in just a query or two.
joinedload in One Query
Use joinedload to fetch parents and children together with a single SQL join.
from sqlalchemy.orm import joinedload
User.query.options(joinedload(User.posts)).all()selectinload for Collections
selectinload loads children in a second batched query, which often scales better for one-to-many lists.
from sqlalchemy.orm import selectinload
User.query.options(selectinload(User.posts)).all()Set Strategy on the Model
You can also pick a default with the relationship's lazy option, like select, joined, or selectin.
posts = db.relationship("Post", lazy="selectin")Join Does Not Eager Load
A plain join filters across tables but does not preload the relationship. For that you still add an eager option.
Choose Loading on Purpose
Lazy is fine for one row; reach for eager loading whenever you loop over many parents and read their children.
Quick Check
You loop over 100 users and read each user's posts. What problem can lazy loading cause?
Recap: Joins and Loading
You can now join tables, spot N+1, and fix it with joinedload or selectinload. Efficient relational reads, done! 🏁
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Объединения и ленивая или жадная загрузка» бесплатный?
Да — полный текст урока «Объединения и ленивая или жадная загрузка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Flask Academy, подпишись на CoddyKit PRO. Курс Flask Academy содержит 4 уроков всего.
Чему я научусь в уроке «Объединения и ленивая или жадная загрузка»?
Избегайте запросов N+1 при переходе по связям. Ты практикуешь Flask Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Flask Academy?
Предыдущий опыт не требуется. Flask Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Объединения и ленивая или жадная загрузка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Flask Academy?
Да. Каждый урок Flask Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Получение строк с помощью query и get
- Фильтрация, сортировка и ограничение результатов
- Определение связей и внешних ключей
- Объединения и ленивая или жадная загрузка