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.
ForeignKeystocke le lien dans la colonne enfantrelationship()avecback_populatesrelie 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 ;selectinloadeffectue 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
- SQLAlchemy Core ou ORM
- Définir des modèles
- Interroger avec la session
- Relations et jointures