[python] Peewee에서 트랜잭션 처리하기

Peewee는 Python에서 사용할 수 있는 가벼운 ORM(Object-Relational Mapping) 라이브러리입니다. 이를 사용하면 간편하게 데이터베이스를 다룰 수 있습니다. Peewee는 특히 트랜잭션 처리를 지원하여 데이터베이스 조작을 안전하게 수행할 수 있습니다. 이번 글에서는 Peewee에서 트랜잭션 처리하는 방법을 알아보겠습니다.

트랜잭션을 사용하기 위한 준비

Peewee를 사용하여 트랜잭션을 처리하기 위해 database 객체를 생성해야 합니다. database 객체는 Peewee의 기본 데이터베이스 연결을 나타내며, transaction 메서드를 사용하여 트랜잭션을 시작할 수 있습니다.

from peewee import *
from playhouse.db_url import connect

# 데이터베이스 연결 설정
db = connect("sqlite:///mydatabase.db")

# 모델 정의
class User(Model):
    username = CharField()
    email = CharField()

    class Meta:
        database = db

# 트랜잭션 처리
with db.transaction():
    # 트랜잭션 내에서 데이터베이스 작업 수행
    user = User.create(username="john", email="john@example.com")
    user.save()

위의 예시에서는 SQLite 데이터베이스를 사용하며, User 모델을 정의하여 데이터를 저장하고 조회하는 예시입니다. with db.transaction(): 구문 내에서 데이터베이스 작업을 수행하면 해당 작업은 하나의 트랜잭션으로 처리됩니다.

트랜잭션 처리 방법

Peewee에서 제공하는 트랜잭션 처리 방법은 다음과 같습니다.

1. db.transaction() 사용

with db.transaction() as txn:
    # 트랜잭션 내에서 데이터베이스 작업 수행
    user = User.create(username="john", email="john@example.com")
    user.save()

2. @db.atomic() 데코레이터 사용

@db.atomic()
def create_user(username, email):
    user = User.create(username=username, email=email)
    user.save()

create_user("john", "john@example.com")

3. @db.atomic() 컨텍스트 매니저 사용

def create_user(username, email):
    user = User.create(username=username, email=email)
    user.save()

with db.atomic():
    create_user("john", "john@example.com")

트랜잭션 롤백하기

트랜잭션 중에 예외가 발생하여 롤백하려면 rollback() 메서드를 사용합니다.

with db.transaction() as txn:
    try:
        user = User.create(username="john", email="john@example.com")
        user.save()
    except Exception as e:
        txn.rollback()  # 롤백
        print("트랜잭션 실패:", str(e))

위의 예시에서는 User 생성 후 save() 메서드를 사용하여 데이터베이스에 저장합니다. 만약 예외가 발생하면 rollback() 메서드를 호출하여 트랜잭션을 롤백합니다.

결론

Peewee를 사용하여 트랜잭션을 처리하는 방법을 알아보았습니다. 트랜잭션은 데이터베이스 작업을 안전하게 처리하기 위해 반드시 필요한 기능입니다. Peewee의 트랜잭션 처리 기능을 적절히 활용하여 데이터의 일관성과 안정성을 유지할 수 있습니다.

참고 문서: Peewee 공식 문서