0Pricing
Python Academy · Leçon

Relations et jointures

Modéliser des tables liées

Relations et jointures est une leçon Python 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 Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.

Tables associées

Les données réelles sont liées entre elles : un auteur possède plusieurs livres, une commande possède plusieurs articles. SQLAlchemy modélise ces liens avec des relations et des clés étrangères.

# Author 1 --- many --- Book
# A foreign key on Book points back to Author
print('One-to-many is the most common link')

Clés étrangères

Une colonne de clé étrangère stocke la clé primaire d’une ligne associée. Déclarez-la avec ForeignKey('table.column').

from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
# author_id: Mapped[int] = mapped_column(ForeignKey('authors.id'))
print('ForeignKey links child to parent')

Définir le parent

Le modèle parent utilise relationship() pour contenir une collection d’enfants.

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from typing import List
class Base(DeclarativeBase):
    pass
class Author(Base):
    __tablename__ = 'authors'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
    books: Mapped[List['Book']] = relationship(back_populates='author')
print('Author.books holds related Book objects')

Définir l’enfant

Le modèle enfant possède la colonne de clé étrangère ainsi qu’un relationship() qui pointe vers le parent.

from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
class Base(DeclarativeBase):
    pass
class Book(Base):
    __tablename__ = 'books'
    id: Mapped[int] = mapped_column(primary_key=True)
    title: Mapped[str]
    author_id: Mapped[int] = mapped_column(ForeignKey('authors.id'))
    author: Mapped['Author'] = relationship(back_populates='books')
print('Book.author points to its parent')

back_populates

back_populates relie les deux relations afin que la modification d’un côté soit automatiquement répercutée de l’autre.

# author.books.append(book) also sets book.author = author
# Both sides stay in sync automatically
print('back_populates keeps both sides consistent')

Parcourir les relations

Une fois la relation établie, vous la parcourez comme des attributs ordinaires : author.books est une liste et book.author est l’objet parent.

# for book in author.books:
#     print(book.title)
# print(book.author.name)
print('Navigate with plain attribute access')

Construire un graphe

Ajoutez les enfants à la collection du parent. Ajouter le parent à la session propage automatiquement l’opération aux enfants.

# a = Author(name='Rowling')
# a.books.append(Book(title='Book 1'))
# session.add(a)
# session.commit()  # author and book both saved
print('Cascade saves the whole object graph')

Jointures implicites

L’accès à book.author demande à SQLAlchemy de charger automatiquement la ligne associée (chargement différé) en arrière-plan.

# Accessing book.author runs a SELECT if not loaded yet
# This is lazy loading
print('Lazy loading fetches related rows on access')

Jointures explicites

Pour filtrer des données réparties entre plusieurs tables, utilisez join() dans une requête select. Cela génère une jointure SQL.

from sqlalchemy import select
# stmt = select(Book).join(Author).where(Author.name == 'Rowling')
# books = session.scalars(stmt).all()
print('join(Author) filters across the relationship')

Chargement anticipé

Pour éviter de nombreuses petites requêtes, chargez les lignes associées à l’avance avec joinedload ou selectinload.

from sqlalchemy import select
from sqlalchemy.orm import selectinload
# stmt = select(Author).options(selectinload(Author.books))
print('selectinload preloads children in one extra query')

Relations plusieurs-à-plusieurs

Pour les liens plusieurs-à-plusieurs, une table d’association relie les deux côtés. Le relationship() utilise secondary= pour la désigner.

# students <-> courses via a 'enrollments' association table
# courses: Mapped[List['Course']] = relationship(secondary=enrollments)
print('secondary= models many-to-many')

Vérification rapide

Vérifiez vos connaissances sur les relations.

Récapitulatif

Vous avez modélisé des tables associées.

  • ForeignKey stocke le lien dans la colonne enfant
  • relationship() avec back_populates relie les deux côtés
  • Parcourez les liens comme de simples attributs ; le chargement différé récupère les données lors de l’accès
  • join() filtre les données entre plusieurs tables ; selectinload effectue un chargement anticipé ; secondary= gère les relations plusieurs-à-plusieurs

Questions Fréquemment Posées

La leçon « Relations et jointures » est-elle gratuite ?

Oui — le texte complet de « Relations et jointures » 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 Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Relations et jointures » ?

Modéliser des tables liées Tu pratiques Python 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 Python Academy ?

Aucune expérience préalable n'est requise. Python 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 « Relations et jointures » ?

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 Python Academy ?

Oui. Chaque leçon Python 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. SQLAlchemy Core ou ORM
  2. Définir des modèles
  3. Interroger avec la session
  4. Relations et jointures
← Retour à Python Academy