본문으로 건너뛰기
백엔드 기초집: 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 미완료 상태