SQLAlchemy 트랜잭션 설계와 데코레이터 활용법

SQLAlchemy는 파이썬에서 가장 널리 사용되는 ORM(Object-Relational Mapping) 라이브러리로, 데이터베이스와의 상호 작용을 보다 쉽게 만들어 줍니다. 본 포스팅에서는 SQLAlchemy의 트랜잭션 설계와 데코레이터 활용 방법에 대해 자세히 살펴보겠습니다.

특히 PostgreSQL 데이터베이스를 기반으로 한 실습을 통해 구체적인 사용 사례를 제시하겠습니다.

썸네일

SQLAlchemy와 PostgreSQL 환경 설정

SQLAlchemy 환경 설정

SQLAlchemy를 활용하기 위해서는 먼저 데이터베이스 환경을 설정해야 합니다. PostgreSQL 데이터베이스를 사용하기 위해 Docker를 활용하여 컨테이너를 띄우는 것이 일반적입니다.

이를 통해 데이터베이스를 손쉽게 구축하고 관리할 수 있습니다. 먼저, PostgreSQL 이미지를 다운로드하고, 데이터베이스와 연결할 수 있는 도커 컨테이너를 생성합니다.

다음은 PostgreSQL 데이터베이스를 실행하기 위한 Docker 명령어입니다.

bash
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

이렇게 하면 PostgreSQL이 실행되는 컨테이너가 생성되며, 로컬의 5432 포트에서 접근할 수 있게 됩니다. 이후 SQLAlchemy와 psycopg2-binary 패키지를 설치하여 PostgreSQL과의 연결을 설정합니다.

bash
pip install sqlalchemy psycopg2-binary

이제 SQLAlchemy를 사용하여 데이터베이스와 연결할 준비가 되었습니다. 다음 단계로 데이터베이스에 필요한 테이블을 생성합니다.

명령어 설명
CREATE TABLE article (id SERIAL PRIMARY KEY, description TEXT) article 테이블을 생성합니다.

위의 SQL 명령어를 통해 article 테이블을 생성하고, 이후 SQLAlchemy ORM을 사용하여 이와 매핑되는 클래스를 정의합니다.

SQLAlchemy 세션과 트랜잭션 관리

PostgreSQL Docker

SQLAlchemy에서 세션(Session)은 데이터베이스와의 통신을 관리하는 중요한 역할을 합니다. 세션은 클라이언트와 데이터베이스 간의 연결을 유지하고, 트랜잭션을 관리합니다.

SQLAlchemy에서 제공하는 sqlalchemy.orm.Session 클래스를 사용하여 세션을 생성하고, 데이터베이스 작업을 수행할 수 있습니다. 세션의 주요 기능은 다음과 같습니다.

  • 트랜잭션 생성: 세션이 시작되면 새로운 트랜잭션이 생성됩니다.
  • 변경 사항 추적: 세션은 ORM 객체의 변경 사항을 추적하고, 커밋될 때 데이터베이스에 반영합니다.
  • 자동 플러시: 세션이 특정 시점에 도달하면 자동으로 변경 사항을 데이터베이스에 반영합니다.

세션을 생성하는 기본적인 방법은 다음과 같습니다.

“`python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine(‘postgresql://user:password@localhost:5432/mydatabase’)
Session = sessionmaker(bind=engine)
session = Session()
“`

이제 세션을 통해 데이터를 추가하고 수정하는 방법을 살펴보겠습니다.

메소드 설명
session.add(object) 객체를 세션에 추가합니다.
session.commit() 트랜잭션을 커밋하여 변경 사항을 데이터베이스에 반영합니다.
session.rollback() 트랜잭션을 롤백하여 변경 사항을 취소합니다.

예를 들어, 새로운 기사 항목을 추가하는 코드는 다음과 같습니다.

python
new_article = Article(description='Sample Article')
session.add(new_article)
session.commit()

이렇게 하면 새로운 기사가 데이터베이스에 추가됩니다. 또한, 세션을 사용할 때는 반드시 commit() 메소드를 호출하여 변경 사항을 저장해야 합니다.

세션이 종료되면 모든 ORM 객체는 세션에서 제거되고, 변경 사항이 롤백됩니다.

다른 내용도 보러가기 #1

SQLAlchemy 데코레이터와 쿼리 커스터마이징

데이터베이스 테이블 생성

SQLAlchemy에서는 데코레이터를 사용하여 쿼리를 커스터마이징할 수 있습니다. 특히 compiles 데코레이터를 활용하면 특정 SQL 쿼리의 동작을 수정할 수 있습니다.

이를 통해 예를 들어 ON CONFLICT DO NOTHING 쿼리를 포함한 삽입 동작을 수행할 수 있습니다. 다음은 compiles 데코레이터를 사용하여 기존의 삽입 쿼리 동작을 변경하는 예시입니다.

“`python
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import Insert

@compiles(Insert)
def insert_on_conflict_do_nothing(insert_stmt, dialect):
return str(insert_stmt) + ” ON CONFLICT DO NOTHING”
“`

이렇게 하면 모든 INSERT 동작에 대해 ON CONFLICT DO NOTHING이 자동으로 추가됩니다. 이를 통해 데이터베이스에 이미 존재하는 항목을 중복으로 추가하는 것을 방지할 수 있습니다.

이제 이러한 커스터마이징된 쿼리를 사용하여 실제로 데이터를 삽입해 보겠습니다.

쿼리 설명
INSERT INTO article (id, description) VALUES (1, 'Sample') ON CONFLICT DO NOTHING 중복된 ID가 있을 경우 아무 작업도 수행하지 않습니다.

이러한 방식으로 SQLAlchemy의 강력한 쿼리 커스터마이징 기능을 활용할 수 있습니다.

Bulk Insert와 ON CONFLICT DO NOTHING

세션과 트랜잭션

SQLAlchemy는 bulk_save_objects 메소드를 제공하여 대량의 데이터를 효율적으로 삽입할 수 있는 기능을 제공합니다. 이 메소드를 사용할 경우 대량의 데이터를 한 번에 데이터베이스에 저장할 수 있으며, ON CONFLICT DO NOTHING을 함께 사용할 수 있습니다.

다음은 bulk_save_objects 메소드를 사용하여 데이터를 삽입하는 코드 예시입니다.

“`python
articles = [
Article(description=’Article 1′),
Article(description=’Article 2′),
Article(description=’Article 3′),
]

session.bulk_save_objects(articles)
session.commit()
“`

이 코드는 여러 개의 기사 항목을 한 번에 삽입합니다. 만약 중복된 항목이 존재할 경우, ON CONFLICT DO NOTHING 덕분에 데이터베이스는 해당 항목을 무시하고, 새로운 항목만 추가하게 됩니다.

메소드 설명
bulk_save_objects(objects) 여러 객체를 한 번에 삽입합니다.
commit() 삽입된 내용을 데이터베이스에 반영합니다.

이러한 동작을 통해 데이터베이스의 성능을 높이고, 불필요한 중복 삽입을 방지할 수 있습니다.

세션 관리와 트랜잭션

트랜잭션 관리는 SQLAlchemy에서 매우 중요한 개념입니다. 기본적으로 SQLAlchemy의 세션은 트랜잭션을 생성하고 관리합니다.

세션이 생성되면, 해당 세션에 대한 트랜잭션이 시작되며, 커밋 또는 롤백이 이루어질 때까지 유지됩니다. 세션을 통한 트랜잭션 관리는 다음과 같은 절차로 이루어집니다.

  1. 세션 생성: 새로운 세션을 생성합니다.
  2. 트랜잭션 시작: 세션이 생성되면 새로운 트랜잭션이 시작됩니다.
  3. 변경 사항 추가: 객체를 추가하거나 수정합니다.
  4. 커밋 또는 롤백: 작업이 완료되면 commit()을 호출하여 변경 사항을 저장하거나, 문제가 발생하면 rollback()을 호출하여 이전 상태로 되돌립니다.

아래는 세션과 트랜잭션을 관리하는 코드 예시입니다.

python
with Session() as session:
try:
new_article = Article(description='New Article')
session.add(new_article)
session.commit()
except Exception as e:
session.rollback()
print(f"Error occurred: {e}")

이렇게 with 구문을 사용하면 세션의 생명 주기를 쉽게 관리할 수 있습니다. 세션이 종료되면 자동으로 close()가 호출되어 리소스가 해제됩니다.

메소드 설명
Session() 새로운 세션을 생성합니다.
commit() 트랜잭션을 커밋하여 변경 사항을 반영합니다.
rollback() 트랜잭션을 롤백하여 변경 사항을 취소합니다.
close() 세션을 종료하고 리소스를 해제합니다.

이런 방식으로 SQLAlchemy의 세션과 트랜잭션 관리를 통해 데이터베이스와의 상호작용을 보다 안전하고 효율적으로 수행할 수 있습니다.

다른 내용도 보러가기 #2

결론

SQLAlchemy는 파이썬에서 데이터베이스와의 상호작용을 간편하게 만들어주는 강력한 도구입니다. 본 포스팅에서는 SQLAlchemy의 트랜잭션 설계와 데코레이터를 활용한 쿼리 커스터마이징 방법에 대해 살펴보았습니다.

PostgreSQL 데이터베이스를 활용한 실습을 통해 세션 관리, 트랜잭션 처리, 그리고 대량 삽입과 같은 다양한 기능을 익힐 수 있었습니다. SQLAlchemy를 활용하면 데이터베이스 작업을 보다 직관적으로 수행할 수 있으며, 이를 통해 개발자는 비즈니스 로직에 더욱 집중할 수 있습니다.

앞으로도 SQLAlchemy의 다양한 기능을 활용하여 더 나은 데이터베이스 관리 및 애플리케이션 개발을 할 수 있기를 바랍니다.

관련 영상

같이 보면 좋은 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다