티스토리 뷰
fastapi를 사용하며 공부한 pydantic에 대해 주요 내용들을 간단하게 정리해 보았다.
pydantic 이란?
pydantic은 데이터 검증 라이브러리로 데이터에 대한 유효성 검사와 직렬화를 제공한다. type annotation 만으로 유효성 검사를 진행하기 때문에 간결하게 구현 가능하다는 장점이 있다.
model
pydantic에서 스키마를 정의하는 주요 방법 중 하나는 모델을 사용하는 것이다. 모델은 pydantic.BaseModel을 사요삭하고 필드를 주석이 달린 attribute로 정의하는 단순한 클래스이다. python dataclass와 유사하지만 유효성 검사, 직렬화 및 json 스키마 생성과 관련된 특정 워크플로우를 간소화하는 중요한 차이가 있다.
다음과 같이 user model이 있다. user는 id와 str 필드를 가진다.
- name : 기본값이 있기 때문에 값의 입력이 필수는 아님.
- id: 필수값
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = 'Jane Doe'
주요 모델 메서드
- model_dump
model_dump를 사용하면 dict로써 값을 받을 수 있다.
user = User(1)
user.model_dump() == {'id': 1, 'name': 'Jane Doe'}
- model_construct
validation없이 모델을 생성하고 싶다면..
유효성 검사가 무의미한 경우, 이미 유효한 데이터로 작업하는 경우에는 해당 메서드를 이용해 볼 수 있다.
class User(BaseModel):
id: int
age: int
name: str = 'John Doe'
original_user = User(id=123, age=32)
bad_user = User.model_construct(id='dog')
print(repr(bad_user))
#> User(id='dog', name='John Doe')
- model_validate
이미 선언된 객체를 스키마로 정의할 때 사용하는 헬퍼함수
전달된 객체가 dict가 아니면 validationError가 발생한다.
class User(BaseModel):
id: int
name: str = 'John Doe'
signup_ts: Optional[datetime] = None
m = User.model_validate({'id': 123, 'name': 'James'})
print(m)
#> id=123 name='James' signup_ts=None
ORM Mode
- ORM 모델의 속성을 읽어 pydantic 모델을 생성할 수 있다.
- 이 때는 model_config['from_attributes'] = True 로 설정한다.
from typing import List
from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.orm import declarative_base
from pydantic import BaseModel, ConfigDict, constr
Base = declarative_base()
# orm 모델
class CompanyOrm(Base):
__tablename__ = 'companies'
id = Column(Integer, primary_key=True, nullable=False)
public_key = Column(String(20), index=True, nullable=False, unique=True)
name = Column(String(63), unique=True)
domains = Column(ARRAY(String(255)))
class CompanyModel(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
public_key: constr(max_length=20)
name: constr(max_length=63)
domains: List[constr(max_length=255)]
co_orm = CompanyOrm(
id=123,
public_key='foobar',
name='Testing',
domains=['example.com', 'foobar.com'],
)
print(co_orm)
#> <__main__.CompanyOrm object at 0x0123456789ab>
co_model = CompanyModel.model_validate(co_orm)
print(co_model)
"""
id=123 public_key='foobar' name='Testing' domains=['example.com', 'foobar.com']
"""
Error handling
- validating에서 오류가 발생하면 validationError 가 발생한다.
- 만약 에러 발생을 의도하려면 다음과 같이 field_validator 데코레이터를 사용한다.
class Model(BaseModel):
foo: str
@field_validator('foo')
def value_must_equal_bar(cls, v):
if v != 'bar':
raise ValueError('value must be "bar"')
return v
TypeAdapter
- basemodel을 상속받은 클래스가 아니지만, 데이터 유효성 검사를 진행하고 싶다면 TypeAdapter를 사용할 수 있다.
class User(TypedDict):
name: str
id: int
UserListValidator = TypeAdapter(List[User])
print(repr(UserListValidator.validate_python([{'name': 'Fred', 'id': '3'}])))
#> [{'name': 'Fred', 'id': 3}]
'개발계발 > Python' 카테고리의 다른 글
python supervisord 사용기 (0) | 2024.03.21 |
---|---|
[Python] asyncio를 사용하여 코루틴 구현해 보기 (0) | 2023.07.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- grafana
- DevOps
- async
- gradle
- NCP
- pytest
- kibana
- logstash
- fastapi
- JWT
- sns로그인
- Pydantic
- elk
- promethus
- Supervisor
- numble
- kubernetes
- GitOps
- ArgoCD
- jwt로그인
- bugfix
- kubectl
- elasticsearch
- OAuth
- await
- factory_boy
- miniproject
- coroutine
- Project
- supervisord
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함