스키마 강제 적용

Python으로 배우는 MongoDB 입문

Filip Schouwenaars

Machine Learning Researcher

유연한 스키마에서 검증된 스키마로

  • MongoDB는 고정 스키마 없이 데이터를 저장할 수 있습니다
  • 빠른 프로토타이핑과 데이터 모델 진화에 적합합니다
mov.insert_one({
    "title": "knives out",
    "genre": ["comedy", "crime", "drama"],
    "year": 2019, # oops
    "rating": 7.9,
})

mov.find_one({ "title": "knives out", "release_year": 2019 })
  • 스키마가 명확하다면, 검증을 설정하는 것이 중요합니다
Python으로 배우는 MongoDB 입문

pydantic으로 스키마 강제하기

  • 데이터 검증 라이브러리
  • 예상 필드와 타입 정의
  • 모든 문서의 설계도
from pydantic import BaseModel
from typing import Optional

class Movie(BaseModel):
    title: str
    genre: list[str]
    release_year: int
    rating: float
    won_oscar: Optional[bool] = None
Python으로 배우는 MongoDB 입문

타입 모델로 삽입하기

# Before
new_movie = {
  "title": "knives out",
  "genre": ["comedy", "crime", "drama"],
  "year": 2019, # oops
  "rating": 7.9,
}
# No output
  • 데이터 형식에 대한 검사 없음
# Now
new_movie = Movie(
  title = "knives out",
  genre = ["comedy", "crime", "drama"],
  year = 2019, # oops
  rating = 7.9,
)
pydantic.error_wrappers.ValidationError:
1 validation error for Movie
release_year: field required
  • 오타와 누락 필드를 컬렉션에 넣기 전에 잡아냅니다!
Python으로 배우는 MongoDB 입문

실수 고치기

from pydantic import BaseModel
from typing import Optional

class Movie(BaseModel):
    title: str
    genre: list[str]
    release_year: int
    rating: float
    won_oscar: Optional[bool] = None 
# 올바른 필드와 값
new_movie = Movie(
  title = "knives out",
  genre = ["comedy", "crime", "drama"],
  release_year = 2019,
  rating = 7.9,
)

mov.insert_one(dict(new_movie))
InsertOneResult(...)
Python으로 배우는 MongoDB 입문

MongoDB의 내장 스키마 검증

client.film.create_collection(
  "movies_v2",
  validator={
    "$jsonSchema": {
      "required": ["title", "genre", "release_year", "rating"],
      "properties": {
        "title": { "bsonType": "string" },
        "genre": { 
          "bsonType": "array",
          "items": { "bsonType": "string" }
        },
        "release_year": { "bsonType": "int" },
        "rating": { "bsonType": "double" },
        "won_oscar": { "bsonType": "bool" }
      }
    }
  }
)
Python으로 배우는 MongoDB 입문

MongoDB 내장 스키마 검증 테스트

client.film.movies_v2.insert_one({
  "title": "knives out",
  "genre": ["comedy", "crime", "drama"],
  "year": 2019, # oops
  "rating": 7.9,
})
pymongo.errors.WriteError: Document failed validation, [...]
'missingProperties': ['release_year'], 'errmsg': 'Document failed validation'}
  • 데이터베이스 수준의 스키마 검증
  • MongoDB에 접근하는 모든 애플리케이션에 적용됨
Python으로 배우는 MongoDB 입문

요약

  • 애플리케이션 측 검증: pydantic.BaseModel
  • 데이터베이스 측 검증: MongoDB 내장 스키마 검증
  • 실수 방지
  • 구조 강제
Python으로 배우는 MongoDB 입문

Ayo berlatih!

Python으로 배우는 MongoDB 입문

Preparing Video For Download...