ความสัมพันธ์และการเชื่อมตาราง
สร้างโมเดลตารางที่เกี่ยวข้องกัน
ความสัมพันธ์และการเชื่อมตาราง เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตารางที่เกี่ยวข้องกัน
ข้อมูลจริงมีความเชื่อมโยงกัน เช่น ผู้เขียนหนึ่งคนมีหนังสือหลายเล่ม และคำสั่งซื้อหนึ่งรายการมีสินค้าหลายชิ้น SQLAlchemy จำลองความเชื่อมโยงเหล่านี้ด้วย ความสัมพันธ์ และ คีย์นอก
# Author 1 --- many --- Book
# A foreign key on Book points back to Author
print('One-to-many is the most common link')คีย์นอก
คอลัมน์ คีย์นอก จะเก็บค่าคีย์หลักของแถวที่เกี่ยวข้อง ประกาศได้ด้วย 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')การกำหนดโมเดลแม่
โมเดลแม่ใช้ relationship() เพื่อเก็บกลุ่มของโมเดลลูก
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')การกำหนดโมเดลลูก
โมเดลลูกมีทั้งคอลัมน์คีย์นอกและ relationship() ที่ชี้กลับไปยังโมเดลแม่
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 เชื่อมความสัมพันธ์ทั้งสองด้านเข้าด้วยกัน ดังนั้นเมื่ออัปเดตด้านหนึ่ง อีกด้านจะสะท้อนการเปลี่ยนแปลงโดยอัตโนมัติ
# author.books.append(book) also sets book.author = author
# Both sides stay in sync automatically
print('back_populates keeps both sides consistent')การเข้าถึงความสัมพันธ์
เมื่อเชื่อมโยงกันแล้ว คุณสามารถเข้าถึงความสัมพันธ์ได้เหมือนแอตทริบิวต์ทั่วไป โดย author.books เป็นรายการ และ book.author เป็นออบเจ็กต์แม่
# for book in author.books:
# print(book.title)
# print(book.author.name)
print('Navigate with plain attribute access')การสร้างกราฟความสัมพันธ์
เพิ่มโมเดลลูกลงในกลุ่มของโมเดลแม่ เมื่อเพิ่มโมเดลแม่เข้าเซสชัน ระบบจะส่งต่อการดำเนินการไปยังโมเดลลูกด้วย
# 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')การเชื่อมตารางโดยอัตโนมัติ
การเข้าถึง book.author จะทำให้ SQLAlchemy โหลดแถวที่เกี่ยวข้องโดยอัตโนมัติ ซึ่งเรียกว่าการโหลดแบบชะลอ และทำงานอยู่เบื้องหลัง
# Accessing book.author runs a SELECT if not loaded yet
# This is lazy loading
print('Lazy loading fetches related rows on access')การเชื่อมตารางโดยระบุเอง
เมื่อต้องการกรองข้อมูลข้ามตาราง ให้ใช้ join() ในคำสั่ง select วิธีนี้จะสร้างคำสั่ง 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')การโหลดข้อมูลล่วงหน้า
เพื่อหลีกเลี่ยงการเรียกดูข้อมูลย่อยจำนวนมาก ให้โหลดแถวที่เกี่ยวข้องไว้ล่วงหน้าด้วย joinedload หรือ 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')ความสัมพันธ์หลายต่อหลาย
สำหรับความสัมพันธ์หลายต่อหลาย ตารางเชื่อมโยงจะเชื่อมทั้งสองฝั่งเข้าด้วยกัน ส่วน relationship() ใช้ secondary= เพื่อชี้ไปยังตารางนั้น
# students <-> courses via a 'enrollments' association table
# courses: Mapped[List['Course']] = relationship(secondary=enrollments)
print('secondary= models many-to-many')ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเรื่องความสัมพันธ์ของคุณ
สรุปทบทวน
คุณได้จำลองตารางที่เกี่ยวข้องกัน
ForeignKeyเก็บความเชื่อมโยงไว้ในคอลัมน์ของโมเดลลูกrelationship()ที่ใช้ร่วมกับback_populatesเชื่อมทั้งสองด้านเข้าด้วยกัน- เข้าถึงความเชื่อมโยงเหมือนแอตทริบิวต์ทั่วไป โดยการโหลดแบบชะลอจะดึงข้อมูลเมื่อมีการเข้าถึง
join()ใช้กรองข้อมูลข้ามตารางselectinloadใช้โหลดข้อมูลล่วงหน้า และsecondary=ใช้จัดการความสัมพันธ์หลายต่อหลาย
คำถามที่พบบ่อย
บทเรียน “ความสัมพันธ์และการเชื่อมตาราง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ความสัมพันธ์และการเชื่อมตาราง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ความสัมพันธ์และการเชื่อมตาราง”
สร้างโมเดลตารางที่เกี่ยวข้องกัน คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ความสัมพันธ์และการเชื่อมตาราง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- SQLAlchemy Core เทียบกับ ORM
- การกำหนดโมเดล
- การสอบถามด้วยเซสชัน
- ความสัมพันธ์และการเชื่อมตาราง