백엔드 기초집: 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
0 / 2관계형 데이터와 Foreign Key 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
17강. 관계형 데이터와 Foreign Key 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.