Relazioni e join
Modellare tabelle correlate
Relazioni e join è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.
Tabelle correlate
I dati reali sono collegati: un autore ha molti libri, un ordine ha molti articoli. SQLAlchemy modella questi collegamenti con relazioni e chiavi esterne.
# Author 1 --- many --- Book
# A foreign key on Book points back to Author
print('One-to-many is the most common link')Chiavi esterne
Una colonna con chiave esterna memorizza la chiave primaria di una riga correlata. La dichiari con 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')Definizione del genitore
Il modello genitore utilizza relationship() per contenere una raccolta di elementi figli.
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')Definizione del figlio
Il modello figlio contiene la colonna con la chiave esterna e una relationship() che punta al genitore.
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 collega le due relazioni, in modo che l'aggiornamento di un lato venga riflesso automaticamente sull'altro.
# author.books.append(book) also sets book.author = author
# Both sides stay in sync automatically
print('back_populates keeps both sides consistent')Navigazione nelle relazioni
Una volta collegati, può attraversare le relazioni come normali attributi: author.books è un elenco, mentre book.author è l'oggetto genitore.
# for book in author.books:
# print(book.title)
# print(book.author.name)
print('Navigate with plain attribute access')Creazione di un grafo
Aggiunga i figli alla raccolta del genitore. Aggiungendo il genitore alla sessione, l'operazione viene propagata ai figli.
# 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')Join impliciti
L'accesso a book.author fa sì che SQLAlchemy carichi automaticamente la riga correlata (caricamento lazy) in background.
# Accessing book.author runs a SELECT if not loaded yet
# This is lazy loading
print('Lazy loading fetches related rows on access')Join espliciti
Per filtrare i dati tra più tabelle, utilizzi join() in una select. In questo modo viene generato un SQL JOIN.
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')Caricamento eager
Per evitare molte query di piccole dimensioni, carichi in anticipo le righe correlate con joinedload o 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')Relazioni molti-a-molti
Per i collegamenti molti-a-molti, una tabella associativa collega entrambi i lati. relationship() utilizza secondary= per indicarla.
# students <-> courses via a 'enrollments' association table
# courses: Mapped[List['Course']] = relationship(secondary=enrollments)
print('secondary= models many-to-many')Verifica rapida
Verifichi le proprie conoscenze sulle relazioni.
Riepilogo
Ha modellato tabelle correlate.
ForeignKeymemorizza il collegamento nella colonna del figliorelationship()conback_populatescollega entrambi i lati- Navighi nei collegamenti come normali attributi; il caricamento lazy recupera i dati quando vi si accede
join()applica filtri tra le tabelle;selectinloadesegue il caricamento eager;secondary=gestisce le relazioni molti-a-molti
Domande Frequenti
La lezione «Relazioni e join» è gratuita?
Sì — il testo completo di «Relazioni e join» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.
Cosa imparerò in «Relazioni e join»?
Modellare tabelle correlate Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Python Academy?
Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Relazioni e join»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Python Academy?
Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.