Пример #1
0
 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
Пример #2
0
 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)
Пример #3
0
 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()
Пример #4
0
 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
Пример #5
0
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")
Пример #6
0
 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
Пример #7
0
 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()