본문으로 건너뛰기
백엔드 기초집: Python FastAPILESSON 17

관계형 데이터와 Foreign Key

난이도초급
예상 시간35분
선수지식이전 강의

17강. 관계형 데이터와 Foreign Key

1. 이번 강의에서 해결할 문제

현재 기록에는 누가 점수를 남겼는지 없습니다. 사용자 테이블과 기록 테이블을 외래키로 연결해 소유권의 기반을 만듭니다.

2. 학습 목표

3. 핵심 개념

사용자 한 명은 기록 여러 개를 가질 수 있고 각 기록은 사용자 한 명에 속합니다. game_records.user_id 외래키가 DB 수준의 참조를 보장하고 relationship은 Python 객체 탐색을 제공합니다. 외래키와 relationship은 서로 대체하지 않습니다.

4. 단계별 코드 예시

파일 경로: game-ranking-api/app/models/user.py

app/models/user.py
from sqlalchemy import String
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.database import Base


class User(Base):
__tablename__ = "users"

id: Mapped[int] = mapped_column(primary_key=True)
username: Mapped[str] = mapped_column(String(50), unique=True, index=True)
password_hash: Mapped[str] = mapped_column(String(255))
role: Mapped[str] = mapped_column(String(20), default="user")
records: Mapped[list["GameRecord"]] = relationship(back_populates="user", cascade="all, delete-orphan")

파일 경로: game-ranking-api/app/models/record.py

app/models/record.py
from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship


class GameRecord(Base):
__tablename__ = "game_records"

id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True)
game_name: Mapped[str]
score: Mapped[int]
user: Mapped["User"] = relationship(back_populates="records")

파일 경로: game-ranking-api/app/models/__init__.py

app/models/__init__.py
from app.models.record import GameRecord
from app.models.user import User

__all__ = ["GameRecord", "User"]

실행 위치: game-ranking-api/

Remove-Item game_ranking.db -ErrorAction SilentlyContinue
$env:JWT_SECRET = 'development-only'
python -c "from app.database import Base, engine; import app.models; Base.metadata.create_all(engine); print(Base.metadata.tables.keys())"
python -m uvicorn app.main:app --reload

5. 코드가 동작하는 이유

ForeignKey 문자열은 실제 테이블과 열을 가리킵니다. back_populates가 두 객체 방향을 연결하고 cascade 정책은 User의 records 컬렉션에서 제거된 자식의 생명주기를 정의합니다. 모델 import가 두 테이블을 metadata에 등록합니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

관계형 데이터와 Foreign Key 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1다음 중 “관계형 데이터와 Foreign Key”의 핵심 요약을 실제 상황에 맞게 적용한 것은 무엇인가요?
  2. 문제 2“관계형 데이터와 Foreign Key” 실습 중 ‘운영 DB를 삭제해 schema를 다시 만듭니다.’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

17강. 관계형 데이터와 Foreign Key 미완료 상태