Relaatiot ja liitokset
Mallinna toisiinsa liittyvät taulut
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.
ForeignKeytallentaa yhteyden lapsen sarakkeeseenrelationship()jaback_populatesyhdistävät molemmat puolet- Liiku yhteyksissä tavallisten attribuuttien tapaan; lazy loading hakee tiedot käytön yhteydessä
join()suodattaa taulukoiden välillä;selectinloadlataa tiedot eager-tilassa;secondary=käsittelee monta moneen -relaatioita
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
- SQLAlchemy Core vai ORM
- Mallien määrittäminen
- Kyselyt Sessionilla
- Relaatiot ja liitokset