Python을 이용한 SQLAlchemy ORM 활용

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}")

태그: sqlalchemy ORM python Databases

5월 23일 18:05에 게시됨