SQLAlchemy
더 많은 작업
SQLAlchemy는 파이썬에서 관계형 데이터베이스와 상호작용하기 위한 SQL 툴킷이자 객체 관계 매핑(ORM) 라이브러리이다.
SQLAlchemy의 엔진은 데이터베이스와의 연결을 관리하며, 커넥션 풀을 포함한다.[3] 엔진은 즉시 데이터베이스에 연결하지 않고, 쿼리 실행 시점에 연결을 확보한다.
SQLAlchemy에서는 MetaData 객체를 사용하여 테이블, 열, 관계 등에 대한 스키마 정의를 표현할 수 있다. 이미 존재하는 데이터베이스의 스키마를 반영(reflect)하여 파이썬 객체로 가져오는 기능도 제공한다.
Core 계층에서는 SQL 표현 언어를 활용하여 SQL 구문을 파이썬 코드로 구성하고 실행할 수 있다. 예: select(), insert(), update(), delete() 등의 함수형 API 제공
ORM 계층에서는 파이썬 클래스를 데이터베이스 테이블에 매핑하고, 인스턴스의 변경 사항을 데이터베이스에 반영할 수 있다. SQLAlchemy ORM은 데이터 매퍼(Data Mapper) 패턴을 채택하여, 도메인 모델과 데이터베이스 구조를 느슨하게 결합한다.[4]
ORM에서는 Session 객체를 통해 객체를 추가, 수정, 삭제하고 트랜잭션 단위로 커밋 또는 롤백할 수 있다. 세션은 변경된 객체를 추적하고, 일괄적으로 SQL 구문을 생성하는 단위 작업(Unit of Work) 패턴을 따른다.
일대다, 다대일, 다대다 관계를 지원하며, 지연 로딩(lazy loading)과 즉시 로딩(eager loading) 등의 전략을 설정할 수 있다. 관계형 데이터를 효율적으로 조회하기 위한 다양한 로딩 옵션을 제공한다.
다음은 SQLAlchemy ORM을 사용한 간단한 예시이다.
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import declarative_base, relationship, sessionmaker
Base = declarative_base()
class Director(Base):
__tablename__ = 'directors'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
movies = relationship("Movie", back_populates="director")
class Movie(Base):
__tablename__ = 'movies'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
year = Column(Integer)
director_id = Column(Integer, ForeignKey('directors.id'))
director = relationship("Director", back_populates="movies")
engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
d = Director(name="Christopher Nolan")
m = Movie(title="Inception", year=2010, director=d)
session.add_all([d, m])
session.commit()
for movie in session.query(Movie).all():
print(movie.title, movie.director.name)
- 러닝 커브가 다소 높다. 초심자가 모든 개념을 이해하기 어렵다.
- ORM 계층의 추상화로 인해 복잡한 쿼리나 성능 최적화가 필요한 경우 Core 또는 순수 SQL을 병행해야 할 때가 있다.
- 부적절한 매핑이나 관계 설정은 N+1 쿼리 문제 등 비효율적 동작을 초래할 수 있다.
- Rick Copeland, Essential SQLAlchemy, O’Reilly Media, 2008
- Mark Ramm & Michael Bayer, SQLAlchemy: Database Access Using Python, Addison-Wesley, 2010