base.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from typing import TypeVar, Type, Sequence, Generic
  2. from sqlalchemy.orm import Session
  3. from app.models.base import BaseModel
  4. M = TypeVar("M", bound=BaseModel)
  5. class CrudService(Generic[M]):
  6. @staticmethod
  7. def get_by_id(model: Type[M], db: Session, id: int) -> M | None:
  8. query = db.query(model)
  9. if hasattr(model, "del_flag"):
  10. query = query.filter(model.del_flag == 0)
  11. return query.filter(model.id == id).first()
  12. @staticmethod
  13. def get_paged(
  14. model: Type[M],
  15. db: Session,
  16. page: int,
  17. page_size: int,
  18. filters: list | None = None,
  19. ) -> tuple[Sequence[M], int]:
  20. query = db.query(model)
  21. if hasattr(model, "del_flag"):
  22. query = query.filter(model.del_flag == 0)
  23. if filters:
  24. query = query.filter(*filters)
  25. total = query.count()
  26. # Default ordering: sort_order ASC, create_time DESC; if no sort_order, just create_time DESC
  27. if hasattr(model, "sort_order"):
  28. query = query.order_by(model.sort_order.asc(), model.create_time.desc())
  29. else:
  30. query = query.order_by(model.create_time.desc())
  31. rows = query.offset((page - 1) * page_size).limit(page_size).all()
  32. return rows, total
  33. @staticmethod
  34. def create(model: Type[M], db: Session, obj_in: dict) -> M:
  35. obj = model(**obj_in)
  36. db.add(obj)
  37. db.flush()
  38. return obj
  39. @staticmethod
  40. def update(model: Type[M], db: Session, id: int, obj_in: dict) -> M | None:
  41. query = db.query(model)
  42. if hasattr(model, "del_flag"):
  43. query = query.filter(model.del_flag == 0)
  44. obj = query.filter(model.id == id).first()
  45. if not obj:
  46. return None
  47. for k, v in obj_in.items():
  48. setattr(obj, k, v)
  49. db.flush()
  50. return obj
  51. @staticmethod
  52. def soft_delete(model: Type[M], db: Session, id: int) -> bool:
  53. query = db.query(model)
  54. if hasattr(model, "del_flag"):
  55. query = query.filter(model.del_flag == 0)
  56. obj = query.filter(model.id == id).first()
  57. if not obj:
  58. return False
  59. obj.del_flag = 1
  60. db.flush()
  61. return True