SQLAlchemy 기본 개념과 설정 방법 안내

2025-10-21 · Uncategorized · 읽는데 12분

SQLAlchemy 기본 개념과 설정 방법 안내
SQLAlchemy는 파이썬에서 데이터베이스와의 상호작용을 용이하게 해주는 ORM(Object Relational Mapping) 라이브러리입니다. 이 글에서는 SQLAlchemy의 기본 개념과 함께 설정 방법에 대해 상세히 설명드리고자 합니다.

SQLAlchemy를 통해 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 직관적으로 수행할 수 있는 방법을 알아보겠습니다.

썸네일

SQLAlchemy의 기본 개념

SQLAlchemy 개념

SQLAlchemy는 데이터베이스와의 연결을 관리하는 엔진, 데이터베이스 구조를 정의하는 모델, 트랜잭션을 관리하는 세션 등 다양한 구성 요소들로 이루어져 있습니다. 이를 통해 개발자는 복잡한 SQL 쿼리 문법을 직접 작성할 필요 없이 객체 지향적으로 데이터베이스를 다룰 수 있습니다.

Engine

SQLAlchemy의 핵심 요소 중 하나는 엔진입니다. 엔진은 데이터베이스와의 연결을 관리하며, 데이터베이스에 접근하기 위해 URL 형식의 접근 주소를 필요로 합니다.

엔진을 생성하기 위해 create_engine() 함수를 사용하며, 이 함수에는 여러 가지 옵션을 설정할 수 있습니다.

옵션 설명
echo SQLAlchemy의 로그를 기록할지 여부
pool_size 연결 풀 내에서 동시에 유지할 연결의 최대 수
pool_recycle 유휴 상태인 연결을 자동으로 종료하기 위한 시간
max_overflow 풀에 있는 연결의 최대 추가 갯수
pool_timeout 연결을 가져오기 위해 대기할 최대 시간
isolation_level 트랜잭션 격리 수준 설정

예를 들어, 다음과 같은 방식으로 엔진을 생성할 수 있습니다.

```python from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://user:password@localhost/db_name', echo=True, pool_size=5) ```

이렇게 생성된 엔진을 사용하여 데이터베이스와의 연결을 관리하게 됩니다.

Base

Base 클래스는 모든 ORM 모델의 기반이 되는 클래스입니다. declarative_base() 함수를 통해 생성되며, 모든 모델 클래스는 이 Base 클래스를 상속받아야 합니다.

Base를 상속받는 각 모델은 데이터베이스 테이블의 구조(이름, 컬럼, 데이터 타입 등)를 정의합니다.

속성 설명
tablename 테이블의 이름
Column 테이블의 컬럼을 정의하는 클래스
Integer 정수형 데이터 타입
String 문자열 데이터 타입

다음은 Base 클래스를 사용하여 간단한 모델을 정의하는 예시입니다.

```python from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String

Base = declarative_base()

class User(Base): tablename = 'users'

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

```

이와 같이 Base를 상속받은 클래스들은 데이터베이스에 저장될 모델을 정의하게 됩니다.

MetaData

MetaData는 SQLAlchemy에서 데이터베이스의 스키마 정보를 저장하고 관리하는 객체입니다. Base를 상속받아 생성된 모델들의 정보들이 MetaData에 저장되며, 이를 통해 전체 데이터베이스 구조를 관리할 수 있습니다.

Base 클래스가 생성될 때 자동으로 MetaData 객체도 생성되며, 모든 모델 클래스들이 MetaData에 등록됩니다.

속성 설명
tables 데이터베이스에 정의된 모든 테이블의 메타데이터를 포함하는 속성
constraints 데이터베이스의 모든 제약 조건을 포함하는 속성
relationships 모델 간의 관계를 정의하는 속성

예를 들어, 다음과 같이 MetaData를 사용하여 데이터베이스의 구조를 확인할 수 있습니다.

```python from sqlalchemy import MetaData

metadata = MetaData() metadata.reflect(bind=engine) for table in metadata.tables: print(table) ```

이 코드를 통해 데이터베이스의 모든 테이블 정보를 출력할 수 있습니다.

Session과 sessionmaker

데이터베이스 엔진

Session은 SQLAlchemy에서 데이터베이스 트랜잭션을 관리하는 중요한 요소입니다. sessionmaker를 사용하여 세션 팩토리를 생성하고, 최종적으로 세션 객체를 생성하여 데이터베이스에 대한 조회, 삽입, 갱신, 삭제 작업을 수행할 수 있습니다.

속성 설명
begin 트랜잭션을 시작하는 메서드
commit 트랜잭션을 커밋하여 변경 사항을 데이터베이스에 반영하는 메서드
rollback 트랜잭션을 롤백하여 마지막 커밋 이전 상태로 되돌리는 메서드

아래는 세션을 생성하고 사용하는 간단한 예시입니다.

```python from sqlalchemy.orm import sessionmaker

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

new_user = User(name='John Doe', age=30) session.add(new_user) session.commit()

users = session.query(User).all() for user in users: print(user.name)

session.close() ```

이와 같이 세션을 통해 데이터베이스와의 트랜잭션을 관리할 수 있습니다.

다른 내용도 보러가기 #1

세션의 재사용과 연결 관리

ORM 모델 구조

세션은 내부적으로 데이터베이스 연결을 풀에서 가져와 사용하며, 작업이 끝난 후에는 다시 풀에 반환합니다. session.close() 메서드를 호출하면 세션을 종료하고, 세션이 관리하고 있던 ORM 객체의 변경 사항 추적을 해제합니다.

그러나 객체는 여전히 메모리에 존재하므로 필요할 때 다시 사용할 수 있습니다.

상태 설명
Active 세션이 활성 상태로 데이터베이스와 연결되어 있는 상태
Closed 세션이 종료되어 더 이상 데이터베이스와 연결되지 않는 상태
Expired 세션이 유효하지 않은 상태로, 새로고침이 필요함

세션을 종료한 후에도 같은 세션 객체를 사용하여 새로운 쿼리를 실행하거나 트랜잭션을 시작할 수 있습니다. 이때 세션은 연결 풀에서 새 연결을 가져와 데이터베이스와 통신하게 됩니다.

그러나 만약 연결 풀 자체를 종료하고자 한다면 engine.dispose() 메서드를 사용해야 합니다.

예시 코드

python session.close() # 세션 종료 new_session = Session()

이와 같이 SQLAlchemy의 세션 관리 기능을 활용하면 효율적인 데이터베이스 작업을 수행할 수 있습니다.

결론

SQLAlchemy는 파이썬에서 데이터베이스와의 상호작용을 보다 직관적이고 효율적으로 처리할 수 있는 ORM 라이브러리입니다. 엔진, Base, MetaData, Session 등의 요소를 알아보고 활용함으로써 복잡한 데이터베이스 작업을 간단히 수행할 수 있습니다.

SQLAlchemy를 통해 데이터베이스와의 연결을 관리하고, 데이터베이스 구조를 정의하며, 트랜잭션을 쉽게 관리할 수 있는 능력을 갖추게 되실 것입니다. SQLAlchemy의 다양한 기능을 충분히 활용하여 데이터베이스 작업을 보다 능률적으로 진행하시길 바랍니다.

같이 보면 좋은 글