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을 사용하면 테이블 간 관계를 정의할 수 있습니다. 예를 들어, User
와 Address
테이블 간의 일대다 관계를 정의해 보겠습니다.
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의 강력한 기능을 익혀보세요!
'Python 고급' 카테고리의 다른 글
Python 데이터베이스 쿼리 최적화 팁 (0) | 2025.01.09 |
---|---|
Python MySQL과 PostgreSQL 연동 방법 (0) | 2025.01.08 |
Python SQLite와 연동하기 (0) | 2025.01.06 |
Python WebSockets를 이용한 실시간 통신 (0) | 2025.01.05 |
Python REST API 요청 처리와 응답 분석 (0) | 2025.01.04 |