Python 고급

Python SQLAlchemy를 이용한 ORM 사용

PyExplorer 2025. 1. 7. 08:47
728x90

Python SQLAlchemy를 이용한 ORM 사용

Python에서 데이터베이스를 다룰 때 가장 흔히 사용하는 방법 중 하나는 SQLAlchemy를 이용한 ORM(Object-Relational Mapping)입니다. SQLAlchemy는 SQL 쿼리를 직접 작성하지 않아도 객체 지향 방식으로 데이터베이스 작업을 할 수 있도록 도와줍니다. 이번 포스팅에서는 SQLAlchemy의 기본 개념과 ORM을 사용하는 방법을 실습 예제와 함께 알아보겠습니다.

1. SQLAlchemy란?

SQLAlchemy는 파이썬에서 데이터베이스와 상호작용하기 위한 ORM 라이브러리입니다. 이를 통해 데이터베이스 작업을 객체 지향적으로 수행할 수 있습니다. SQLAlchemy는 두 가지 주요 구성 요소로 이루어져 있습니다:

  • Core: SQLAlchemy의 기본 SQL 처리 엔진으로, SQL을 직접 작성하여 데이터베이스 작업을 수행할 수 있습니다.
  • ORM: 객체 지향적인 방식으로 데이터베이스 작업을 수행하도록 설계된 레이어입니다.

2. SQLAlchemy 설치

SQLAlchemy를 사용하려면 먼저 라이브러리를 설치해야 합니다. pip 명령어를 사용하여 설치할 수 있습니다:

pip install sqlalchemy
pip install psycopg2  # PostgreSQL을 사용하는 경우

데이터베이스 종류에 따라 다른 드라이버를 설치해야 할 수 있습니다. 예: MySQL은 pymysql, SQLite는 별도 설치가 필요 없습니다.

3. SQLAlchemy ORM 기본 설정

3.1 데이터베이스 연결

SQLAlchemy에서 데이터베이스에 연결하려면 create_engine을 사용합니다.

from sqlalchemy import create_engine

# SQLite 데이터베이스 연결
engine = create_engine('sqlite:///example.db', echo=True)

위 코드에서 example.db는 SQLite 데이터베이스 파일이며, echo=True는 SQLAlchemy가 실행하는 SQL 쿼리를 출력하도록 설정합니다.

3.2 기본 Declarative Base 생성

Declarative Base는 SQLAlchemy ORM의 기본 클래스입니다. 이를 사용하여 데이터베이스 테이블과 매핑되는 모델을 정의합니다.

from sqlalchemy.orm import declarative_base

Base = declarative_base()

4. 모델 정의하기

ORM에서 테이블은 Python 클래스와 매핑됩니다. 각 클래스는 데이터베이스의 테이블을 나타내며, 클래스 속성은 테이블의 컬럼을 나타냅니다.

from sqlalchemy import Column, Integer, String

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    age = Column(Integer)

    def __repr__(self):
        return f"<User(name='{self.name}', age='{self.age}')>"

위 코드에서 __tablename__은 테이블 이름을 지정하며, Column은 테이블의 각 컬럼을 정의합니다.

5. 데이터베이스 테이블 생성

모델을 정의한 후, 데이터베이스에 테이블을 생성합니다.

Base.metadata.create_all(engine)

이 명령은 Base에 정의된 모든 모델에 대해 데이터베이스에 테이블을 생성합니다.

6. 세션 사용하기

SQLAlchemy에서 데이터베이스 작업은 세션을 통해 이루어집니다. 세션은 데이터베이스 연결을 관리하고 트랜잭션을 처리합니다.

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

7. CRUD 작업 예제

7.1 데이터 추가

데이터를 추가하려면 객체를 생성하고 세션에 추가한 후 커밋합니다.

new_user = User(name='Alice', age=25)
session.add(new_user)
session.commit()

7.2 데이터 조회

데이터를 조회하려면 query 메서드를 사용합니다.

# 모든 사용자 조회
users = session.query(User).all()
for user in users:
    print(user)

# 특정 조건 조회
alice = session.query(User).filter_by(name='Alice').first()
print(alice)

7.3 데이터 수정

데이터를 수정하려면 객체를 조회한 후 속성을 변경하고 커밋합니다.

alice.age = 26
session.commit()

7.4 데이터 삭제

데이터를 삭제하려면 객체를 조회한 후 세션에서 삭제합니다.

session.delete(alice)
session.commit()

8. 고급 기능

8.1 관계 정의

SQLAlchemy ORM을 사용하면 테이블 간 관계를 정의할 수 있습니다. 예를 들어, UserAddress 테이블 간의 일대다 관계를 정의해 보겠습니다.

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Address(Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)
    email = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", back_populates="addresses")

User.addresses = relationship("Address", order_by=Address.id, back_populates="user")

8.2 조인 쿼리

관계를 정의한 후에는 조인 쿼리를 통해 관련 데이터를 가져올 수 있습니다.

user_with_addresses = session.query(User).join(Address).filter(User.name == 'Alice').all()
print(user_with_addresses)

9. SQLAlchemy ORM의 장단점

장점

  • SQL 문법을 몰라도 객체 지향 방식으로 데이터베이스 작업 가능
  • 여러 데이터베이스 시스템을 지원
  • 관계형 데이터베이스 모델링에 유리함

단점

  • 복잡한 SQL 쿼리는 성능 저하 가능성
  • 초기 설정 및 학습 곡선이 있음

결론

SQLAlchemy를 이용하면 데이터베이스 작업을 훨씬 더 직관적이고 간결하게 처리할 수 있습니다. 특히 ORM을 사용하면 객체 지향적으로 데이터를 다룰 수 있어 생산성이 크게 향상됩니다. 이번 포스팅에서는 기본적인 사용법부터 고급 기능까지 살펴보았습니다. 앞으로 다양한 실습을 통해 SQLAlchemy의 강력한 기능을 익혀보세요!

728x90