0Pricing
Python Academy · Lekcja

Relacje i złączenia

Modeluj powiązane tabele

Relacje i złączenia to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Powiązane tabele

Rzeczywiste dane są ze sobą powiązane: autor ma wiele książek, a zamówienie ma wiele pozycji. SQLAlchemy modeluje te zależności za pomocą relacji i kluczy obcych.

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

Klucze obce

Kolumna klucza obcego przechowuje klucz główny powiązanego wiersza. Należy ją zadeklarować za pomocą 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')

Definiowanie obiektu nadrzędnego

Model nadrzędny używa funkcji relationship(), aby przechowywać kolekcję obiektów podrzędnych.

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')

Definiowanie obiektu podrzędnego

Model podrzędny zawiera kolumnę klucza obcego oraz funkcję relationship() wskazującą z powrotem na obiekt nadrzędny.

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 łączy obie relacje, dzięki czemu aktualizacja jednej strony jest automatycznie odzwierciedlana po drugiej stronie.

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

Nawigowanie po relacjach

Po połączeniu relację można przechodzić tak jak zwykłe atrybuty: author.books to lista, a book.author to obiekt nadrzędny.

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

Budowanie grafu

Dodawaj obiekty podrzędne do kolekcji obiektu nadrzędnego. Dodanie obiektu nadrzędnego do sesji powoduje kaskadowe dodanie obiektów podrzędnych.

# 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')

Połączenia niejawne

Uzyskanie dostępu do book.author powoduje, że SQLAlchemy automatycznie ładuje powiązany wiersz w tle (jest to ładowanie leniwe).

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

Połączenia jawne

Aby filtrować dane z wielu tabel, użyj join() w zapytaniu select. Spowoduje to wygenerowanie instrukcji 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')

Wczesne ładowanie

Aby uniknąć wielu małych zapytań, załaduj powiązane wiersze z wyprzedzeniem za pomocą joinedload lub 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')

Relacja wiele-do-wielu

W przypadku relacji wiele-do-wielu tabela pośrednia łączy obie strony. Funkcja relationship() używa parametru secondary=, aby wskazać tę tabelę.

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

Szybki sprawdzian

Sprawdź swoją wiedzę na temat relacji.

Podsumowanie

Nauczył się Pan/Nauczyła się Pani modelować powiązane tabele.

  • ForeignKey przechowuje powiązanie w kolumnie obiektu podrzędnego
  • relationship() wraz z back_populates łączy obie strony relacji
  • Po powiązaniach można nawigować jak po zwykłych atrybutach; ładowanie leniwe pobiera dane przy uzyskaniu dostępu
  • join() umożliwia filtrowanie w wielu tabelach, selectinload ładuje dane z wyprzedzeniem, a secondary= obsługuje relacje wiele-do-wielu

Często zadawane pytania

Czy lekcja „Relacje i złączenia” jest bezpłatna?

Tak — pełny tekst „Relacje i złączenia” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Relacje i złączenia”?

Modeluj powiązane tabele Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Relacje i złączenia”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. SQLAlchemy Core a ORM
  2. Definiowanie modeli
  3. Zapytania za pomocą Session
  4. Relacje i złączenia
← Powrót do Python Academy