from typing import TypeVar, Generic, Optional, List, Type, Annotated from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, update, delete from sqlmodel import SQLModel from fastapi import Depends from app.core.database import get_session ModelType = TypeVar("ModelType", bound=SQLModel) class BaseRepository(Generic[ModelType]): def __init__(self, model: Type[ModelType], session: Annotated[AsyncSession, Depends(get_session)]): self.model = model self._session = session async def create(self, obj_in: ModelType) -> ModelType: db_obj = self.model.model_validate(obj_in) self._session.add(db_obj) await self._session.commit() await self._session.refresh(db_obj) return db_obj async def get(self, id: int) -> Optional[ModelType]: statement = select(self.model).where(self.model.id == id) result = await self._session.execute(statement) return result.scalar_one_or_none() async def get_all(self, skip: int = 0, limit: int = 100) -> List[ModelType]: statement = select(self.model).offset(skip).limit(limit) result = await self._session.execute(statement) return result.scalars().all() async def update(self, id: int, obj_in: dict) -> Optional[ModelType]: # Получаем объект и обновляем его напрямую result = await self._session.execute( select(self.model).where(self.model.id == id) ) db_obj = result.scalar_one_or_none() if not db_obj: return None for key, value in obj_in.items(): setattr(db_obj, key, value) await self._session.commit() await self._session.refresh(db_obj) return db_obj async def delete(self, id: int) -> bool: statement = delete(self.model).where(self.model.id == id) result = await self._session.execute(statement) await self._session.commit() return result.rowcount > 0