SQLAlchemy 2 ORM 입문: 객체 저장과 트랜잭션 확인

SQLAlchemy ORM은 클래스를 테이블에 매핑하지만, 저장 확정과 오류 처리는 트랜잭션 단위로 명시해야 합니다.

어떤 상황에서 적용하나요?

예제는 SQLAlchemy 2 계열과 SQLite 메모리 DB를 사용합니다. python -m pip install "sqlalchemy>=2,<3"으로 설치하세요. 원격 DB나 기존 파일을 변경하지 않고 모델 선언부터 조회까지 확인할 수 있습니다.

검증 범위: 아래 코드는 외부 서비스에 요청하지 않는 로컬 예제입니다. 실제 서비스 연결은 별도로 검증해야 합니다.

최소 예제로 동작 확인하기

from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session

class Base(DeclarativeBase):
    pass

class Task(Base):
    __tablename__ = "tasks"
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]

engine = create_engine("sqlite://")
Base.metadata.create_all(engine)
with Session(engine) as session:
    with session.begin():
        session.add(Task(name="월간 보고서"))
with Session(engine) as session:
    names = session.scalars(select(Task.name)).all()
    assert names == ["월간 보고서"]
    print(names)
engine.dispose()

결과는 어떻게 확인하나요?

조회 결과는 월간 보고서 한 건입니다. 첫 세션에서 트랜잭션을 종료한 뒤 새 세션으로 읽기 때문에 저장 확정까지 확인합니다. add만 호출한 뒤 프로그램을 종료하는 경우와 구분하세요.

실제 업무에 적용할 때 확인할 점

create_all은 이미 존재하는 운영 테이블의 복잡한 구조 변경을 대신하는 마이그레이션 도구가 아닙니다. 데이터가 늘어나면 발행되는 SQL과 조회 횟수도 확인해야 합니다. ORM을 쓴다는 이유만으로 SQL 지식이나 인덱스 설계가 필요 없어지지는 않습니다.

공식 자료와 다음 단계

관련 공식 문서에서 사용하는 버전의 기능과 제한을 확인하세요.

학습 경로: 데이터 처리 가이드 · 중복 저장 처리

작성: 로그 · 2026-10-17 수정: 확인되지 않은 경험담과 성능 보장 표현을 제거하고 예제·적용 조건·공식 근거를 보완했습니다.

댓글

이 블로그의 인기 게시물

API 키 저장 방법: 해싱과 암호화의 차이, Fernet 예제

파이썬 Google Sheets API 연동: 서비스 계정 권한과 읽기·쓰기

Pandas 결측치 처리: isna, fillna, dropna 선택 기준