Flask Academy · Урок

Объединения и ленивая или жадная загрузка

Избегайте запросов N+1 при переходе по связям.

Урок 4 из 413 шагов

«Объединения и ленивая или жадная загрузка» — бесплатный урок 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.posts

The 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 — локальная установка не требуется.

Все уроки этого курса

  1. Получение строк с помощью query и get
  2. Фильтрация, сортировка и ограничение результатов
  3. Определение связей и внешних ключей
  4. Объединения и ленивая или жадная загрузка
← Назад к Flask Academy