본문 바로가기

[FastAPI] Schemas Models 와 다른 경우 예제

@Jeeqong 2025. 3. 22. 02:35
반응형

서론

Create 스키마와 실제 DB 모델이 다를 경우, 가장 일반적인 패턴은 요청(Request) 스키마와 데이터베이스 모델을 변환하는 중간 계층을 만듬

본문

1. Create 스키마와 DB 모델이 다를 경우 예제

📌 예시

  • 클라이언트에서 데이터를 보낼 때는 created_at, id가 필요 없음.
  • 하지만 DB에 넣을 때는 created_at, id가 자동 생성되어야 함.

이럴 경우 schemas.py에서 Create 스키마와 Response 스키마를 분리하고,
CRUD 함수에서 변환


2. schemas.py에서 Create 스키마와 DB 스키마 구분

from pydantic import BaseModel
from typing import Optional
from datetime import datetime

# 📌 1️⃣ 클라이언트가 보낼 데이터 구조 (id, created_at 없음)
class EventProductEventCreate(BaseModel):
    product_name: str
    brand: Optional[str] = None
    category: Optional[str] = None
    start_date: datetime
    end_date: datetime
    user_id: Optional[str] = None

# 📌 2️⃣ 응답용 스키마 (DB에 저장된 데이터 포함)
class EventProductResponse(BaseModel):
    id: str  # DB에서 자동 생성
    product_name: str
    brand: Optional[str] = None
    category: Optional[str] = None
    start_date: datetime
    end_date: datetime
    user_id: Optional[str] = None
    created_at: datetime  # DB에서 자동 생성

    class Config:
        orm_mode = True

3. models.py에서 실제 DB 모델과 매핑

from sqlalchemy import Column, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
import uuid
from datetime import datetime

Base = declarative_base()

class EventProductEvent(Base):
    __tablename__ = "group_buying_events"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))  # UUID 자동 생성
    product_name = Column(String, nullable=False)
    brand = Column(String)
    category = Column(String)
    start_date = Column(DateTime, nullable=False)
    end_date = Column(DateTime, nullable=False)
    user_id = Column(String, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow)  # 자동 생성

4. CRUD 함수에서 변환 처리

스키마(schemas.py)와 실제 DB 모델이 다르다면,
CRUD 함수에서 변환하는 게 일반적인 방법이야.

📌 crud.py에서 변환 처리

from sqlalchemy.orm import Session
from models import EventProductEvent
from schemas import EventProductCreate
import uuid
from datetime import datetime

def event_product_event(db: Session, event: EventProductCreate):
    # 요청 데이터를 DB 모델로 변환 (id, created_at 자동 생성)
    db_event = EventProduct(
        id=str(uuid.uuid4()),  # UUID 자동 생성
        product_name=event.product_name,
        brand=event.brand,
        category=event.category,
        start_date=event.start_date,
        end_date=event.end_date,
        user_id=event.user_id,
        created_at=datetime.utcnow(),  # 현재 시간 자동 생성
    )
    db.add(db_event)
    db.commit()
    db.refresh(db_event)  # DB에서 최신 데이터 불러오기
    return db_event

5. API 엔드포인트에서 활용 (routes/schedules.py)

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from database import get_db
from schemas import EventProductCreate, EventProductResponse
from crud import create_event_product

router = APIRouter()

@router.post("/event_product", response_model=EventProductResponse)
def create_event(event: EventProductCreate, db: Session = Depends(get_db)):
    return create_event_product(db, event)

6. 정리: Create 스키마와 DB 스키마가 다를 경우 처리 방법

1. schemas.py에서 Create 스키마와 Response 스키마를 분리

  • Create: 클라이언트가 보낼 데이터 (id, created_at 없음)
  • Response: DB에 저장된 데이터 (id, created_at 포함)

 

2. models.py에서 DB 모델을 정의 (id, created_at 자동 생성)

  • id: UUID 자동 생성
  • created_at: datetime.utcnow() 기본값 사용

 

3. crud.py에서 Create 스키마 → DB 모델로 변환

  • id와 created_at을 DB 모델에서 자동 생성하도록 설정

 

4. API 엔드포인트에서는 Create 스키마를 받아서 CRUD 함수에 전달

  • response_model=EventProductResponse를 사용해 응답을 통일

 

 

2025.03.19 - [🌎 Dev(for macos)/Python] - [FastAPI] Schemas 예제 개념 정리

 

[FastAPI] Schemas 예제 개념 정리

schemas.py는 FastAPI에서 Pydantic을 활용하여 API의 데이터 검증과 직렬화를 담당하는 파일임.주로 요청(Request)과 응답(Response)에서 사용되는 데이터 구조를 정의하는 역할1. schemas.py의 역할데이터 유효

jeeqong.tistory.com

 

반응형
Jeeqong
@Jeeqong :: JQVAULT

Jeeqong's vault : 정보/기록을 쌓아두는 공간 웹개발 포스팅 일상 리뷰를 기록하는 공간입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차