[python] SQLAlchemy-Utils를 사용하여 데이터베이스에서 히스토리 로깅하기

데이터베이스의 변경 이력을 추적하고 관리하는 것은 매우 중요합니다. SQLAlchemy-Utils는 이러한 데이터베이스 히스토리 로깅을 위한 유용한 도구를 제공합니다. 이 툴을 사용하면 데이터베이스의 각 변경 사항을 로깅하고 시간에 따라 추적할 수 있습니다.

SQLAlchemy-Utils란?

SQLAlchemy-Utils는 SQLAlchemy를 보완하기 위한 확장 패키지로, 다양한 유틸리티 및 추가 기능을 제공합니다. 이를 사용하면 데이터베이스 모델링 및 상호작용을 보다 효율적으로 처리할 수 있습니다.

데이터베이스 히스토리 로깅 설정하기

먼저 SQLAlchemy-Utils를 설치합니다.

pip install sqlalchemy-utils

다음으로, SQLAlchemy 모델에서 히스토리 로깅을 활성화하기 위해 history 컬럼을 추가합니다.

from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_utils import Timestamp, create_hybrid_property
from sqlalchemy_utils.types import UUIDType
import uuid
from datetime import datetime

Base = declarative_base()

class User(Base, Timestamp):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    uuid = Column(UUIDType(binary=False), default=uuid.uuid4)
    name = Column(String(50))
    created_at = create_hybrid_property(lambda self: datetime.utcnow())
    updated_at = create_hybrid_property(lambda self: datetime.utcnow())

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

위의 예시에서 Timestamp 클래스를 이용하여 created_atupdated_at 컬럼에 대한 자동 관리를 설정하고, UUIDType을 사용하여 uuid 컬럼을 생성합니다.

변경 사항 로깅하기

이제 변경 사항을 로깅하려면 SQLAlchemy-Utils의 changeset을 사용하여 변경 내용을 추적할 수 있습니다.

from sqlalchemy_utils import changeset

user = User(name='Alice')
with changeset(User, user) as user_changeset:
    user.name = 'Bob'

print(user_changeset.added)
print(user_changeset.modified)
print(user_changeset.deleted)

위 코드에서는 changeset을 사용하여 user 객체의 변경 내용을 추적하고 있습니다. 이를 통해 변경된 값, 추가된 값 및 삭제된 값에 대한 정보를 얻을 수 있습니다.

결론

SQLAlchemy-Utils를 사용하여 데이터베이스 히스토리 로깅을 설정하고, 변경 사항을 추적하는 방법에 대해 살펴보았습니다. 이를 통해 데이터베이스의 변경 이력을 체계적으로 관리할 수 있고, 데이터 무결성 유지에 도움이 될 것입니다.