1. 모델 (SQLAlchemy ORM 모델):
- 모델은 SQLAlchemy ORM을 사용하여 데이터베이스 테이블에 매핑되는 파이썬 클래스를 나타냅니다.
- 모델 클래스는 데이터베이스 테이블의 열에 매핑되는 필드(속성)와 데이터를 조작하는 메서드(예: 쿼리, 삽입, 업데이트)를 포함합니다.
- 각 모델은 데이터 구조 및 테이블 간의 관계(있을 경우)를 정의하며, 기본적으로 데이터베이스와 상호작용하는 청사진 역할을 합니다.
예시:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
위 예시에서 User
는 데이터베이스의 users
테이블에 매핑되는 모델입니다.
2. 스키마 (Pydantic 또는 Marshmallow):
- FastAPI의 맥락에서 스키마는 보통 Pydantic 모델을 의미하며, 이는 데이터 유효성 검사 및 직렬화(즉, 입력/출력 데이터가 특정 구조를 따르는지 확인)를 위해 사용됩니다.
- SQLAlchemy 모델이 데이터베이스 테이블을 정의하고 조작하는 데 사용되는 반면, Pydantic 스키마는 API 엔드포인트를 통해 송수신되는 데이터의 형태를 정의합니다. 주로 입력/출력 데이터의 유효성을 검사하고 올바른 데이터 형식과 필수 필드가 존재하는지 확인하는 데 중점을 둡니다.
- 일부 경우에서 "스키마"는 전체 데이터베이스 스키마(예: 테이블 구조)를 의미할 수도 있지만, 대부분의 웹 프레임워크(예: FastAPI)에서는 데이터 유효성 검사를 위한 Pydantic 모델을 가리킵니다.
예시 (Pydantic 스키마):
from pydantic import BaseModel
class UserSchema(BaseModel):
id: int
name: str
class Config:
orm_mode = True
위 예시에서 UserSchema
는 API를 통해 데이터를 송수신할 때 기대되는 User
객체의 구조를 정의하는 스키마입니다.
주요 차이점:
-
모델 (SQLAlchemy ORM):
- 데이터베이스 구조(테이블 및 열)를 나타냅니다.
- 데이터베이스 상호작용(CRUD 작업)에 중점을 둡니다.
- SQLAlchemy ORM은 파이썬 클래스를 데이터베이스 테이블에 매핑하는 데 모델을 사용합니다.
- 스키마 (Pydantic/유효성 검사):
- API에서 데이터 유효성 검사 및 직렬화에 사용됩니다.
- API와 클라이언트 간에 교환되는 데이터의 구조를 정의하는 데 중점을 둡니다.
- FastAPI에서는 Pydantic 스키마를 사용하여 입력 및 출력 데이터가 올바른지 확인합니다.
FastAPI 애플리케이션에서는 데이터베이스 상호작용을 위한 SQLAlchemy 모델과 데이터 유효성 검사를 위한 Pydantic 스키마를 모두 사용하게 됩니다.
In English
In SQLAlchemy ORM, the terms model and schema often have distinct meanings but are sometimes used interchangeably depending on the context. Here's the breakdown of each:
1. Model (SQLAlchemy ORM Model):
- A model represents a Python class that is mapped to a database table using SQLAlchemy ORM.
- The model class contains fields (attributes) that map to the columns in the database table and methods that allow interaction with the data (e.g., queries, inserts, updates).
- Each model defines the structure of the data and relationships between tables (if any), and is essentially a blueprint for interacting with the underlying database.
Example:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
In this example, User
is the model that maps to the users
table in the database.
2. Schema (Pydantic or Marshmallow):
- In the context of FastAPI, schemas often refer to Pydantic models, which are used for data validation and serialization (i.e., ensuring that input/output data conforms to a specific structure).
- While SQLAlchemy models are used to define and manipulate database tables, Pydantic schemas are used to define the shape of data that is sent or received through API endpoints. They focus more on input/output validation and ensuring that data is correct (e.g., types, required fields).
- In some cases, "schema" can also refer to the overall database schema (e.g., table structures), but in most web frameworks like FastAPI, it refers to Pydantic models for validation.
Example (Pydantic Schema):
from pydantic import BaseModel
class UserSchema(BaseModel):
id: int
name: str
class Config:
orm_mode = True
In this example, UserSchema
is the schema that defines the expected structure of a User
object when sending data over the API.
Key Differences:
-
Model (SQLAlchemy ORM):
- Represents the database structure (tables and columns).
- Focuses on database interaction (CRUD operations).
- SQLAlchemy ORM uses models to map Python classes to database tables.
- Schema (Pydantic/Validation):
- Used for data validation and serialization in APIs.
- Focuses on defining the structure of data exchanged between the API and clients.
- Pydantic schemas (schemas in this context) are typically used to ensure that the incoming and outgoing data in FastAPI is correct.
In a FastAPI application, you usually have both SQLAlchemy models for database interaction and Pydantic schemas for API data validation.