72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
"""
|
|
기본 레파지토리 추상 클래스
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
from typing import TypeVar, Generic, Optional, List, Type
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
|
|
from extensions import db, custom_logger
|
|
import settings
|
|
|
|
# Generic type for model entitles
|
|
T = TypeVar("T")
|
|
|
|
logger = custom_logger(f"{settings.LOG_PREFIX}_repository")
|
|
|
|
class BaseRepository(ABC, Generic[T]):
|
|
"""
|
|
기본직인 CRUD 제공
|
|
"""
|
|
|
|
@property
|
|
@abstractmethod
|
|
def model(self) -> Type[T]:
|
|
"""레파지토리 반환"""
|
|
pass
|
|
|
|
@property
|
|
def session(self):
|
|
"""현재 DB 세션 가져오기"""
|
|
return db.session
|
|
|
|
def create(self, entity: T) -> T:
|
|
"""엔티티 생성"""
|
|
try:
|
|
self.session.add(entity)
|
|
self.session.flush()
|
|
logger.debug(f"{self.model.__name__} 생성완료: {getattr(entity, 'id', 'unknown')}")
|
|
return entity
|
|
except SQLAlchemyError as e:
|
|
logger.error(f"{self.model.__name__} 생성 실패: {str(e)}")
|
|
raise
|
|
|
|
def update(self, entity) -> T:
|
|
"""엔티티 수정"""
|
|
try:
|
|
self.session.add(entity)
|
|
self.session.flush()
|
|
logger.debug(f"{self.model.__name__} 수정완료: {getattr(entity, 'id', 'unknown')}")
|
|
return entity
|
|
except SQLAlchemyError as e:
|
|
logger.error(f"{self.model.__name__} 수정 실패: {str(e)}")
|
|
raise
|
|
|
|
def delete(self, entity: T) -> bool:
|
|
"""엔티티 삭제"""
|
|
try:
|
|
self.session.delete(entity)
|
|
self.session.flush()
|
|
logger.debug(f"{self.model.__name__} 삭제완료: {getattr(entity, 'id', 'unknown')}")
|
|
return True
|
|
except SQLAlchemyError as e:
|
|
logger.error(f"{self.model.__name__} 삭제 실패: {str(e)}")
|
|
raise
|
|
|
|
def count(self) -> int:
|
|
"""엔티티 개수 반환"""
|
|
try:
|
|
return self.session.query(self.model).count()
|
|
except SQLAlchemyError as e:
|
|
logger.error(f"{self.model.__name__} 개수 조회 실패: {str(e)}")
|
|
raise |