SQLAlchemy ORM을 활용한 데이터베이스 작업 가이드

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을 사용합니다.
  • 연결 풀 크기와 타임아웃 설정을 적절히 구성합니다.
  • 모델 또는 애플리케이션 계층에서 데이터 무결성을 검증합니다.

태그: sqlalchemy ORM python Database CRUD

5월 28일 08:06에 게시됨