728x90
반응형
일반적으로 모든 모델에 공통된 필드를 편하게 넣기 위해서 BaseModel을 만들어 사용하곤 한다. 필자의 경우엔 FastAPI의 SQLModel에서 Base 모델을 만들고 싶어서 아래와 같이 만들었다.
import re
from sqlalchemy.ext.declarative import declared_attr
from sqlmodel import SQLModel
def camel_to_snake_case(name):
# 정규 표현식을 사용하여 CamelCase를 snake_case로 변환합니다.
name = re.sub("([a-z0-9])([A-Z])", r"\1_\2", name)
return name.lower()
class Base(SQLModel):
# id: int = Field(primary_key=True, index=True)
__name__: str
# created_at: datetime = Field(default_factory=datetime.utcnow)
# updated_at: datetime | None = Field(nullable=True)
# Generate __tablename__ automatically
@declared_attr
def __tablename__(cls) -> str:
return camel_to_snake_case(cls.__name__)
class Config:
orm_mode = True
arbitrary_types_allowed = True
- id는 모든 테이블에 인조키를 넣도록 기획 되었을 때
- created_at과 updated_at은 모든 테이블의 로우에 생성, 업데이트 시간을 기록하도록 기획 되었을 때 주석을 푼다.
- __tablename__ 메소드는 상속 받은 모델의 클래스 이름을 snake_case로 변환해 읽어온다. 예를 들어서 클래스 이름이 TestPost면 이름이 test_post 인 테이블에 매핑된다.
- Config 클래스에선 orm_mode = True 옵션을 켜야 orm이 정상적으로 작동한다.
- arbitrary_types_allowed 는 임의 타입을 허용하는 옵션이다. pydantic에서 해석하지 못하는 컬럼의 타입에 대해서 임의 타입을 허용해주는 옵션으로 보인다. 자세한 내용은 아래 pydantic의 공식 문서를 참고한다.
https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.arbitrary_types_allowed
실제 사용하는 방법은 매우 간단하게 상속해주고 table=True 옵션을 넣으면 된다.
from datetime import datetime
from sqlalchemy import Column, String, Text
from sqlmodel import Field
from app.models.base import Base
class Post(Base, table=True):
id: int = Field(primary_key=True, index=True)
name: str = Field()
author: str = Field()
description: str = Field(sa_column=Column("_description", String))
images: list[str] = Field(sa_column=Column("_images", Text))
updated_at: datetime | None = Field(nullable=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
728x90
반응형
'Backend > FastAPI' 카테고리의 다른 글
FastAPI SQLModel에서 Column alias 하는 방법 (feat. sa_column) (0) | 2024.03.20 |
---|---|
[FastAPI] Docker Container에 Crontab 이용하기 (0) | 2023.07.18 |