0Pricing
Python Academy · บทเรียน

ความสัมพันธ์และการเชื่อมตาราง

สร้างโมเดลตารางที่เกี่ยวข้องกัน

ความสัมพันธ์และการเชื่อมตาราง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. SQLAlchemy Core เทียบกับ ORM
  2. การกำหนดโมเดล
  3. การสอบถามด้วยเซสชัน
  4. ความสัมพันธ์และการเชื่อมตาราง
← กลับไปที่ Python Academy