SQLAlchemy는 Python에서 가장 널리 사용되는 ORM(Object Relational Mapping) 프레임워크 중 하나로, 데이터베이스 작업을 효과적이고 유연하게 처리할 수 있게 해줍니다. 이 문서에서는 SQLAlchemy ORM을 사용하여 데이터베이스를 어떻게 다루는지 설명합니다.
설치하기
bash
pip install sqlalchemy
특정 데이터베이스에 연결하려면 해당 드라이버도 설치해야 합니다:
bash
# PostgreSQL
pip install psycopg2-binary
# MySQL
pip install mysql-connector-python
# SQLite (Python 표준 라이브러리에 포함되어 있으므로 추가 설치 필요 없음)
핵심 개념들
- 엔진(Engine): 데이터베이스와 통신하는 연결 엔진
- 세션(Session): 모든 영속성 작업을 관리하는 데이터베이스 세션
- 모델(Model): 테이블에 대응하는 데이터 모델 클래스
- 쿼리(Query): 쿼리를 생성하고 실행하는 객체
데이터베이스 연결 설정
python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
Base = declarative_base()
engine = create_engine('sqlite:///sample.db', echo=True)
Session = sessionmaker(bind=engine)
db_session = Session()
데이터 모델 정의
python
from sqlalchemy import Column, Integer, String, ForeignKey
class Member(Base):
__tablename__ = 'members'
id = Column(Integer, primary_key=True)
username = Column(String(50), nullable=False)
email_addr = Column(String(100), unique=True)
posts = relationship("Article", back_populates="author")
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String(100))
content_text = Column(String(500))
member_id = Column(Integer, ForeignKey('members.id'))
author = relationship("Member", back_populates="posts")
테이블 생성
python
Base.metadata.create_all(engine)
기본 CRUD 작업
데이터 생성
python
new_member = Member(username='kim', email_addr='kim@example.com')
db_session.add(new_member)
db_session.commit()
데이터 읽기
python
all_members = db_session.query(Member).all()
first_member = db_session.query(Member).first()
specific_member = db_session.query(Member).get(1)
데이터 업데이트
python
member_to_update = db_session.query(Member).get(1)
member_to_update.username = 'kim_updated'
db_session.commit()
데이터 삭제
python
member_to_delete = db_session.query(Member).get(1)
db_session.delete(member_to_delete)
db_session.commit()
데이터 조회
기본 쿼리
python
all_records = db_session.query(Member).all()
names_only = db_session.query(Member.username).all()
sorted_by_name = db_session.query(Member).order_by(Member.username.desc()).all()
limited_results = db_session.query(Member).limit(10).all()
offset_results = db_session.query(Member).offset(5).limit(10).all()
필터링 쿼리
python
from sqlalchemy import or_
exact_match = db_session.query(Member).filter(Member.username == 'kim').first()
like_query = db_session.query(Member).filter(Member.username.like('k%')).all()
in_clause = db_session.query(Member).filter(Member.username.in_(['kim', 'lee'])).all()
multi_conditions = db_session.query(Member).filter(
Member.username == 'kim',
Member.email_addr.like('%@example.com')
).all()
or_condition = db_session.query(Member).filter(
or_(Member.username == 'kim', Member.username == 'lee')
).all()
not_equal = db_session.query(Member).filter(Member.username != 'kim').all()
트랜잭션 관리
python
try:
new_user = Member(username='test_user', email_addr='test@example.com')
db_session.add(new_user)
db_session.commit()
except Exception as e:
db_session.rollback()
print(f"Error occurred: {e}")