반응형
서론
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
반응형
'Dev > Python' 카테고리의 다른 글
[FastAPI + PostgreSQL] psycopg2 ENUM 에러 "GENERAL" 해결기 (0) | 2025.03.25 |
---|---|
[Python] 주석(Comment) vs. 독스트링(Docstring) 차이점 (0) | 2025.03.24 |
[FastAPI] Schemas 예제 개념 정리 (0) | 2025.03.21 |
🚨[Alembic] 명령어 및 오류 설정확인 (0) | 2025.03.20 |
[FastAPI] FastAPI+ Alembic 설정 및 프로세스 정리 (0) | 2025.03.19 |