ORM (Object Relational Mapping) w/ Pydantic and SQLAlchemy

2022. 5. 6. 18:08Cloud 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