SQLAlchemy는 Python에서 가장 널리 사용되는 ORM(Object-Relational Mapping) 프레임워크 중 하나로, 데이터베이스 작업을 효율적이고 유연하게 처리할 수 있게 해줍니다. 이 문서에서는 SQLAlchemy ORM을 이용하여 데이터베이스를 조작하는 방법에 대해 설명합니다.
목차
- SQLAlchemy 설치
- 핵심 개념
- 데이터베이스 연결
- 데이터 모델 정의
- 테이블 생성
- 기본 CRUD 작업
- 데이터 조회
- 관계 관리
- 트랜잭션 관리
- 최적화 팁과 트릭
설치
pip install sqlalchemy
특정 데이터베이스에 연결하려면 해당 데이터베이스 드라이버도 설치해야 합니다:
# PostgreSQL
pip install psycopg2-binary
# MySQL
pip install mysql-connector-python
# SQLite (Python 표준 라이브러리에 포함되어 있어 별도 설치 필요 없음)
핵심 개념
- Engine: 데이터베이스와 통신하기 위한 연결 엔진
- Session: 모든 영속성 작업을 관리하는 데이터베이스 세션
- Model: 테이블을 나타내는 데이터 모델 클래스
- Query: 쿼리를 구성하고 실행하는 객체
데이터베이스 연결
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///sample.db', echo=True)
SessionMaker = sessionmaker(autocommit=False, autoflush=False, bind=engine)
session = SessionMaker()
데이터 모델 정의
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base
Base = declarative_base()
class Member(Base):
__tablename__ = 'members'
id = Column(Integer, primary_key=True)
username = Column(String(50), nullable=False)
email = Column(String(100), unique=True)
posts = relationship("Post", back_populates="author")
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String(100), nullable=False)
content = Column(String(500))
author_id = Column(Integer, ForeignKey('members.id'))
author = relationship("Member", back_populates="posts")
테이블 생성
Base.metadata.create_all(bind=engine)
기본 CRUD 작업
데이터 생성
new_member = Member(username="kim", email="kim@example.com")
session.add(new_member)
session.commit()
데이터 읽기
member = session.query(Member).get(1)
데이터 업데이트
member.username = "lee"
session.commit()
데이터 삭제
session.delete(member)
session.commit()
데이터 조회
간단한 쿼리
members = session.query(Member).all()
필터링 쿼리
from sqlalchemy import or_
filtered_members = session.query(Member).filter(or_(Member.username == "kim", Member.email.like("%@example.com"))).all()
관계 관리
member = Member(username="park", email="park@example.com")
post = Post(title="My First Post", content="Hello World!", author=member)
session.add(post)
session.commit()
트랜잭션 관리
try:
member = Member(username="test_user", email="test@example.com")
session.add(member)
session.commit()
except Exception as e:
session.rollback()
print(f"Error occurred: {e}")
최적화 팁과 트릭
- 세션은 각 요청마다 새로 생성하고 요청이 완료되면 닫습니다.
- 예외 처리를 항상 수행하고 필요한 경우 트랜잭션을 롤백합니다.
- N+1 문제를 피하기 위해 eager loading을 사용합니다.
- 연결 풀 크기와 타임아웃 설정을 적절히 구성합니다.
- 모델 또는 애플리케이션 계층에서 데이터 무결성을 검증합니다.