관계와 조인
관련 테이블 모델링하기
관계와 조인은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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')명시적 조인
테이블을 가로질러 필터링하려면 select에서 join()을 사용합니다. 그러면 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는 자식 열에 연결 정보를 저장합니다back_populates와 함께 사용하는relationship()은 양쪽을 연결합니다- 연결을 일반 속성처럼 탐색하며, 지연 로딩은 접근할 때 데이터를 가져옵니다
join()은 테이블을 가로질러 필터링하고,selectinload는 즉시 로딩하며,secondary=는 다대다 관계를 처리합니다
자주 묻는 질문
“관계와 조인” 강의는 무료인가요?
네 — “관계와 조인” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“관계와 조인”에서 뭘 배우나요?
관련 테이블 모델링하기 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Python Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“관계와 조인” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.