ORM (Object Relational Mapping) w/ Pydantic and SQLAlchemy
2022. 5. 6. 18:08ㆍCloud Native/Database
- 목차
반응형
ORM ?
ORM은 객체를 DB로 mapping 해 주는 것
객체 모델과 관계형 모델간의 불일치를 자동으로 매꿔줌
장점
객체 지향적인 코드가 바로 DB로 저장될 수 있음
보다 직관적이며 business logic에 focus 할 수 있음
재사용 및 유지보수에 용이함
객체 간의 관계로 query를 자동으로 생성하여 RDBMS의 data 구조와 Java 객체 모델 간 간격을 줄임
단점
성능상의 문제가 발생할 수 있음
DBMS의 "특징을 활용한" 최적화가 어려움
객체지향적인 사고로만 ORM을 설계할 경우 DB의 파편화가 심해져 성능의 문제, 복잡도를 야기할 수 있음
어떤 table에 묶여서 저장될 수 있는 것도 객체지향에서는 여러 객체의 composition으로 모델링 될 수 있음
Sqlalchemy의 ORM
class SongORM(declarative_base):
__tablename__ = "song"
id = Column(Integer, primary_key=True)
name = Column(String(128))
genre = Column(String(32))
artist = Column(String(64))
created_at = Column(DateTime, nullable=False)
Pydantic을 통해 data model을 정의하면 쉽게 값을 생성할 수 있다.
from datetime import datetime
from uuid import UUID, uuid4
import pydantic
class Song(pydantic.BaseModel):
id: UUID = pydantic.Field(default_factory=uuid4)
name: str
genre: str
artist: str
created_at: datetime = pydantic.Field(default_factory=datetime.now)
Song을 생성한다.
entity = Song(name="One Direction", artist="Night Changes", genre="Pop")
song model 객체를 통해 여러 business logic을 처리한 후, 이를 DB에 저장하고자 할 때 다음과 같이 ORM 객체를 생성한다.
song_orm = SongORM(id=str(entity.id, name=entity.name, genre=entity.genre, artist=entity.artist, created_at=entity.created_at)
session을 통해 add 한 뒤 commit 하여 DB에 저장한다.
database_url = "sqlite:///db.sqlite3?check_same_thread=False"
engine = create_engine(database_url, encoding="utf-8", pool_pre_ping=True)
session = orm.sessionmaker(
autocommit=False,
autoflush=False,
bind=engine,
)
session.add(song_orm)
session.commit()
반응형
'Cloud Native > Database' 카테고리의 다른 글
master table, transaction table (0) | 2022.04.30 |
---|---|
개념적 모델링, 논리적 모델링 (0) | 2022.04.30 |
정규화 (0) | 2022.04.30 |
PostgreSQL (0) | 2022.01.11 |
GraphQL (0) | 2022.01.10 |