SQLAlchemy ORM 퀵스타트

SQLAlchemy ORM 퀵스타트 (ORM Quickstart)

SQLAlchemy 2.0의 ORM은 파이썬 클래스와 데이터베이스 테이블을 매핑해서, SQL을 직접 쓰지 않고도 파이썬 객체로 데이터를 다루게 해 줘요. 여기서는 가장 간단한 예제로 전체 흐름을 따라가 볼게요. 예제는 SQLite의 인메모리 데이터베이스를 사용해서, 별도 설정 없이 바로 실행해 볼 수 있어요.

출처: SQLAlchemy — ORM Quickstart

엔진과 세션

먼저 데이터베이스에 연결하는 엔진을 만든 뒤, ORM이 작업하는 단위인 세션을 만들어요. 2.0부터는 sessionmaker로 세션 팩토리를 만들고, Session()으로 인스턴스를 얻는 흐름이 표준이에요.

from sqlalchemy import create_engine
from sqlalchemy.orm import Session

engine = create_engine("sqlite://", echo=True)
session = Session(engine)

테이블을 클래스로 선언하기

DeclarativeBase를 상속받는 베이스를 만들고, 그 위에 파이썬 클래스를 정의하면 테이블이 돼요. 각 속성은 mapped_column()으로 컬럼을 나타내며, 타입 어노테이션으로 파이썬 타입을 함께 표기해요.

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "user_account"

    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(30))
    fullname: Mapped[str | None]

객체 저장과 조회

매핑된 클래스의 인스턴스를 만들고 session.add()로 추가한 뒤 session.commit()을 호출하면 트랜잭션이 커밋되며 저장돼요.

session.add(User(name="spongebob", fullname="Spongebob Squarepants"))
session.commit()

조회는 select() 함수를 써요. select(User)로 테이블을 선택하고, session.scalars()로 결과 행을 ORM 객체로 받아와요.

from sqlalchemy import select

result = session.scalars(select(User).where(User.name == "spongebob"))
user = result.one()

더 알아보기