Python에서의 데이터베이스 작업: SQLAlchemy ORM 활용

SQLAlchemy ORM을 통한 데이터베이스 조작 가이드

SQLAlchemy는 파이썬에서 사용할 수 있는 강력한 객체 관계 매핑(ORM) 프레임워크로, 다양한 데이터베이스와의 상호작용을 효율적으로 처리할 수 있습니다. 이 문서에서는 SQLAlchemy를 이용한 데이터베이스 작업 방법에 대해 설명합니다.

설치 및 환경 구성

pip install sqlalchemy

특정 데이터베이스 연결을 위해 필요한 드라이버도 설치해야 합니다:

# PostgreSQL
pip install psycopg2-binary

# MySQL
pip install mysql-connector-python

# SQLite (표준 라이브러리 포함)

핵심 개념

  • 엔진: 데이터베이스 연결을 담당하는 핵심 컴포넌트
  • 세션: 데이터베이스 작업을 관리하는 컨텍스트
  • 모델: 데이터베이스 테이블과 일대일 대응되는 클래스
  • 쿼리: 데이터 조회 및 수정을 위한 명령어 집합

데이터베이스 연결 설정

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 엔진 생성 예시
engine = create_engine('sqlite:///example.db', echo=True)

# 세션 팩토리 정의
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 세션 인스턴스 생성
session = SessionLocal()

데이터 모델 정의

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base

Base = declarative_base()

class 사용자(Base):
    __tablename__ = '사용자'
    
    id = Column(Integer, primary_key=True)
    이름 = Column(String(50), nullable=False)
    이메일 = Column(String(100), unique=True)
    
    게시물 = relationship("게시물", back_populates="작성자")
    
class 게시물(Base):
    __tablename__ = '게시물'
    
    id = Column(Integer, primary_key=True)
    제목 = Column(String(100), nullable=False)
    내용 = Column(String(500))
    작성자_id = Column(Integer, ForeignKey('사용자.id'))
    
    작성자 = relationship("사용자", back_populates="게시물")
    
    태그 = relationship("태그", secondary="게시물_태그", back_populates="게시물")

class 태그(Base):
    __tablename__ = '태그'
    
    id = Column(Integer, primary_key=True)
    이름 = Column(String(30), unique=True)
    
    게시물 = relationship("게시물", secondary="게시물_태그", back_populates="태그")

class 게시물_태그(Base):
    __tablename__ = '게시물_태그'
    
    게시물_id = Column(Integer, ForeignKey('게시물.id'), primary_key=True)
    태그_id = Column(Integer, ForeignKey('태그.id'), primary_key=True)

테이블 생성 및 삭제

Base.metadata.create_all(bind=engine)
# Base.metadata.drop_all(bind=engine)

기본 CRUD 연산

데이터 생성

신규_사용자 = 사용자(이름="김철수", 이메일="kimcheolsu@example.com")
session.add(신규_사용자)
session.commit()

데이터 조회

사용자_목록 = session.query(사용자).all()
첫_사용자 = session.query(사용자).first()
특정_사용자 = session.query(사용자).get(1)

데이터 수정

사용자 = session.query(사용자).get(1)
사용자.이름 = "김철수"
session.commit()

데이터 삭제

사용자 = session.query(사용자).get(1)
session.delete(사용자)
session.commit()

고급 쿼리 기능

필터링 조건

from sqlalchemy import or_

사용자 = session.query(사용자).filter(사용자.이름 == "김철수").first()
사용자_목록 = session.query(사용자).filter(사용자.이름.like("김%")).all()

집계 함수

from sqlalchemy import func

사용자_수 = session.query(사용자).count()
게시물_통계 = session.query(
    사용자.이름, 
    func.count(게시물.id)
).join(게시물).group_by(사용자.이름).all()

관계 관리

새_사용자 = 사용자(이름="박민지", 이메일="parkminji@example.com")
새_게시물 = 게시물(제목="첫 게시물", 내용="안녕하세요!", 작성자=new_user)
session.add(new_post)
session.commit()

트랜잭션 처리

try:
    새_사용자 = 사용자(이름="트랜잭션_사용자", 이메일="transaction@example.com")
    session.add(new_user)
    session.commit()
except Exception as e:
    session.rollback()
    print(f"오류 발생: {e}

최적화 전략

  • 요청별 세션 생성 및 종료 관리
  • 예외 처리 시 트랜잭션 롤백 수행
  • 연관관계 로딩 최적화
  • 커넥션 풀 설정 최적화
  • 데이터 검증 로직 구현

태그: sqlalchemy ORM 데이터베이스 파이썬 모델링

6월 3일 21:07에 게시됨