Python/Today
SQLAlchemy ORM 특징
DGeon
2025. 8. 22. 09:30
구분 설명
| ORM(Object Relational Mapping) | 파이썬 객체와 데이터베이스 테이블을 매핑하여 SQL 대신 객체 지향적으로 DB 조작 가능 |
| 데이터베이스 독립성 | SQLite, PostgreSQL, MySQL, Oracle 등 다양한 DB 엔진을 지원하며 코드 변경 최소화 |
| 세션(Session) 기반 관리 | DB 연결, 트랜잭션, 객체 상태(Transient, Pending, Persistent, Detached)를 세션에서 관리 |
| 쿼리 빌더(Query Builder) | 스타일: 2.0 권장 스타일 사용 — select()/insert()/update()/delete() + session.execute(stmt) (과거 session.query()는 레거시). 표현식 구성: 컬럼·연산자·함수를 조합해 SQL을 파이썬 객체로 구성. 예) select(User).where(User.is_active, User.age >= 20). 조인: 관계 기반 조인 join(User.orders) 또는 조건 기반 조인 join(Order, User.id == Order.user_id), 외부조인 outerjoin() 지원. 서브쿼리/CTE/윈도우: subquery(), cte(), func.row_number().over(partition_by=..., order_by=...) 등 고급 SQL 구성 가능. 집계/그룹핑: func.count(), group_by(), having()로 통계/리포트성 쿼리 작성. 정렬·페이징: order_by(), limit(), offset()로 페이지네이션 구현. 실행/결과 처리: session.execute(stmt) → Result/ScalarResult; .scalars().all(), .one(), .first(), .fetchall() 등으로 소비. 파라미터 바인딩/보안: 값은 자동 바인딩되어 SQL 인젝션 방지; 필요 시 bindparam()로 명시 바인딩. 갱신 쿼리: update(User).where(...).values(...), delete(User).where(...); 필요 시 returning()으로 변경된 행 컬럼 회수. 트랜잭션 연동: with Session(engine) as s, s.begin(): s.execute(...)로 원자성 보장. 디버깅/로깅: create_engine(echo=True)로 SQL 출력, stmt.compile(compile_kwargs={"literal_binds": True})로 SQL 문자열 확인. 다이얼렉트 대응: 동일한 표현식이 DB별 방언에 맞춰 컴파일되어 이식성 확보. |
| 지연 로딩(Lazy Loading) | 필요한 시점에만 관련 객체를 로드하여 불필요한 쿼리 최소화 |
| 관계 매핑 | 일대일(One-to-One), 일대다(One-to-Many), 다대다(Many-to-Many) 관계를 선언적으로 정의 가능 |
| 트랜잭션 관리 | 세션 단위에서 commit/rollback 처리로 일관성 있는 데이터 관리 |
| 스키마 정의 | Declarative Base를 통해 모델 클래스로 테이블 스키마를 직관적으로 정의 |
| 복잡한 쿼리 지원 | Join, Subquery, CTE, 집계 함수 등 SQL 수준의 고급 쿼리 지원 |
| Migration 연동 | Alembic과 같은 도구와 연계하여 스키마 버전 관리 가능 |
| 성능 최적화 기능 | Eager loading, 캐싱, 배치 쿼리(batch query) 등 다양한 최적화 기법 제공 |
| 유연성 | ORM뿐 아니라 Core(SQL Expression Language)도 함께 제공하여 ORM과 원시 SQL 혼용 가능 |