base.py 887 B

12345678910111213141516171819202122232425262728293031323334
  1. from __future__ import annotations
  2. from typing import Generic, TypeVar
  3. from sqlalchemy import select
  4. from sqlalchemy.orm import Session
  5. from supply_infra.db.base import Base
  6. T = TypeVar("T", bound=Base)
  7. class BaseRepository(Generic[T]):
  8. """Generic CRUD repository — subclass per entity."""
  9. model: type[T]
  10. def __init__(self, session: Session) -> None:
  11. self.session = session
  12. def get_by_id(self, id: int) -> T | None:
  13. return self.session.get(self.model, id)
  14. def list_all(self, *, limit: int = 100, offset: int = 0) -> list[T]:
  15. stmt = select(self.model).limit(limit).offset(offset)
  16. return list(self.session.scalars(stmt).all())
  17. def add(self, entity: T) -> T:
  18. self.session.add(entity)
  19. self.session.flush()
  20. return entity
  21. def delete(self, entity: T) -> None:
  22. self.session.delete(entity)