async def bulk_create(cls: Type[TBase], objects: List[TBase]) -> List[TBase]: db: AsyncSession = get_db() try: db.add_all(objects) await db.flush() except IntegrityError as e: cls._raise_validation_exception(e) return objects
async def save(self, commit: bool = True) -> None: db: AsyncSession = get_db() db.add(self) try: if commit: await db.commit() else: await db.flush() except IntegrityError as e: self._raise_validation_exception(e)
async def filter( cls: Type[TBase], filters: Dict[str, Any], sorting: Optional[Dict[str, str]] = None, prefetch: Optional[Tuple[str, ...]] = None, ) -> List[TBase]: query = cls._get_query(prefetch) db = get_db() if sorting is not None: query = query.order_by(*cls._build_sorting(sorting)) db_execute = await db.execute(query.where(sa.and_(True, *cls._build_filters(filters)))) return db_execute.scalars().all()
async def bulk_update(cls: Type[TBase], objects: List[TBase]) -> List[TBase]: db: AsyncSession = get_db() try: ids = [x.id for x in objects if x.id] await db.execute(sa.select(cls).where(cls.id.in_(ids))) for item in objects: try: await db.merge(item) except IntegrityError as e: cls._raise_validation_exception(e) await db.flush() except IntegrityError as e: cls._raise_validation_exception(e) return objects
async def transaction() -> AsyncGenerator[None, None]: db: AsyncSession = get_db() """if select was called before than implicit transaction has already started""" if not db.in_transaction(): async with db.begin(): logger.debug("explicit transaction begin") yield logger.debug("explicit transaction commit") else: logger.debug("already in transaction") yield if db.in_transaction(): await db.commit() logger.debug("implicit transaction commit")
async def get_by_id(cls: Type[TBase], obj_id: int, prefetch: Optional[Tuple[str, ...]] = None) -> Optional[TBase]: query = cls._get_query(prefetch).where(cls.id == obj_id) db = get_db() db_execute = await db.execute(query) instance = db_execute.scalars().first() return instance
async def all(cls: Type[TBase], prefetch: Optional[Tuple[str, ...]] = None) -> List[TBase]: query = cls._get_query(prefetch) db = get_db() db_execute = await db.execute(query) return db_execute.scalars().all()