Python Academy · Oppitunti

Relaatiot ja liitokset

Mallinna toisiinsa liittyvät taulut

Oppitunti 4/413 vaihetta

Relaatiot ja liitokset on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Liittyvät taulukot

Todelliset tiedot liittyvät toisiinsa: tekijällä on monta kirjaa ja tilauksella monta nimikettä. SQLAlchemy mallintaa nämä yhteydet relaatioilla ja viiteavaimilla.

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

Viiteavaimet

Viiteavainsarake tallentaa toisiinsa liittyvän rivin perusavaimen. Ilmoittakaa se muodossa 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')

Vanhemman määrittäminen

Vanhemman malli käyttää relationship()-funktiota lasten kokoelman säilyttämiseen.

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

Lapsen määrittäminen

Lapsen mallissa on viiteavainsarake sekä relationship(), joka osoittaa takaisin vanhempaan.

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 yhdistää nämä kaksi relaatiota, joten toisen puolen päivittäminen näkyy automaattisesti myös toisella puolella.

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

Relaatioissa liikkuminen

Kun relaatiot on yhdistetty, voitte käsitellä niitä tavallisten attribuuttien tapaan: author.books on luettelo ja book.author on vanhemman olio.

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

Oliograafin rakentaminen

Lisätkää lapset vanhemman kokoelmaan. Vanhemman lisääminen istuntoon lisää automaattisesti myös lapset.

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

Implisiittiset liitokset

book.author-attribuutin käyttäminen käynnistää SQLAlchemyn lataamaan liittyvän rivin automaattisesti (lazy loading) taustalla.

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

Eksplisiittiset liitokset

Kun suodatatte tietoja taulukoiden välillä, käyttäkää join()-funktiota select-lauseessa. Tämä muodostaa SQL JOIN -lauseen.

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

Eager-lataus

Välttääksenne monet pienet kyselyt ladatkaa liittyvät rivit etukäteen käyttämällä joinedload- tai selectinload-toimintoa.

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

Monta moneen -relaatiot

Monta moneen -yhteyksissä liitostaulu yhdistää molemmat osapuolet. relationship() käyttää secondary=-parametria osoittamaan siihen.

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

Pikatarkistus

Testatkaa relaatio-osaamistanne.

Kertaus

Opitte mallintamaan toisiinsa liittyviä taulukoita.

  • ForeignKey tallentaa yhteyden lapsen sarakkeeseen
  • relationship() ja back_populates yhdistävät molemmat puolet
  • Liiku yhteyksissä tavallisten attribuuttien tapaan; lazy loading hakee tiedot käytön yhteydessä
  • join() suodattaa taulukoiden välillä; selectinload lataa tiedot eager-tilassa; secondary= käsittelee monta moneen -relaatioita
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”Relaatiot ja liitokset” ilmainen?

Kyllä – oppitunnin ”Relaatiot ja liitokset” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Relaatiot ja liitokset”?

Mallinna toisiinsa liittyvät taulut Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Relaatiot ja liitokset”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. SQLAlchemy Core vai ORM
  2. Mallien määrittäminen
  3. Kyselyt Sessionilla
  4. Relaatiot ja liitokset
← Takaisin: Python Academy