Flask Academy · Leçon

Jointures et chargement différé ou immédiat

Évitez les requêtes N+1 lors du parcours des relations.

Leçon 4 sur 413 étapes

Jointures et chargement différé ou immédiat est une leçon Flask Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Flask Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Flask Academy comprend 4 leçons au total.

Interroger plusieurs tables

Vous pouvez parfois filtrer des parents à partir des données de leurs enfants. Un join permet à une seule requête de couvrir deux tables liées. 🔀

Écrire un join

Appelez join() sur une requête pour y intégrer un modèle lié, puis filtrez sur l’un ou l’autre côté dans une même requête combinée.

q = User.query.join(Post).filter(Post.title == "Hi")

Filtrer sur la table liée

Après un join, vous pouvez utiliser des conditions portant sur l’autre modèle et trouver ainsi les parents selon le contenu de leurs enfants.

active = User.query.join(Post).filter(Post.public).all()

Le chargement différé est activé par défaut

Par défaut, les relations sont différées : les enfants ne sont chargés qu’au moment où vous accédez réellement à cet attribut.

user = User.query.first()
user.posts

Le problème N+1

Parcourir les parents et lire leurs enfants de manière différée déclenche une requête par parent. Ce schéma N+1 dégrade discrètement les performances. 😬

for u in User.query.all():
    print(len(u.posts))

Le chargement anticipé résout le problème

Le chargement anticipé récupère les lignes liées dès le départ, de sorte que tout le graphe soit chargé en une ou deux requêtes seulement.

joinedload en une seule requête

Utilisez joinedload pour récupérer les parents et les enfants ensemble au moyen d’un seul join SQL.

from sqlalchemy.orm import joinedload
User.query.options(joinedload(User.posts)).all()

selectinload pour les collections

selectinload charge les enfants dans une seconde requête groupée, ce qui s’adapte souvent mieux aux listes un-à-plusieurs.

from sqlalchemy.orm import selectinload
User.query.options(selectinload(User.posts)).all()

Définir la stratégie sur le modèle

Vous pouvez également choisir une valeur par défaut avec l’option lazy de la relation, par exemple select, joined ou selectin.

posts = db.relationship("Post", lazy="selectin")

join ne déclenche pas le chargement anticipé

Un join simple filtre entre les tables, mais ne précharge pas la relation. Pour cela, vous devez toujours ajouter une option de chargement anticipé.

Choisir intentionnellement le chargement

Le chargement différé convient à une seule ligne ; privilégiez le chargement anticipé lorsque vous parcourez de nombreux parents et lisez leurs enfants.

Vérification rapide

Vous parcourez 100 utilisateurs et lisez les publications de chacun. Quel problème le chargement différé peut-il provoquer ?

Récapitulatif : jointures et chargement

Vous savez maintenant effectuer un join entre des tables, repérer le problème N+1 et le résoudre avec joinedload ou selectinload. Les lectures relationnelles efficaces sont maîtrisées ! 🏁

Gratuit pour commencer

Apprends Python avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
30
Leçons
120

Questions Fréquemment Posées

La leçon « Jointures et chargement différé ou immédiat » est-elle gratuite ?

Oui — le texte complet de « Jointures et chargement différé ou immédiat » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Flask Academy, passe à CoddyKit PRO. Le cours Flask Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Jointures et chargement différé ou immédiat » ?

Évitez les requêtes N+1 lors du parcours des relations. Tu pratiques Flask Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Flask Academy ?

Aucune expérience préalable n'est requise. Flask Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Jointures et chargement différé ou immédiat » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Flask Academy ?

Oui. Chaque leçon Flask Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Récupérer des lignes avec query et get
  2. Filtrer, trier et limiter les résultats
  3. Définir les relations et les clés étrangères
  4. Jointures et chargement différé ou immédiat
← Retour à Flask Academy