Как стать автором
Обновить

Комментарии 7

Cпасибо за третью часть по работе с SqlAlchemy, очень ждал её выхода, каждый день проверял на наличие уведомления о ней !)

1) Что по поводу метода merge? О нем вообще ни сказано ни слова было, хотя это достаточно удобный метод для обновления модели по её ID:

    async def update(self, entity: TEntity) -> int:

        """

        Updates an existing entity with id (!) or creates a new one if it does not exist.

        This method uses the SQLAlchemy `merge` function to either update an existing

        entity with the same id in the database or create a new entity if no such

        entity exists. Return id

        Args:

            entity (Model): The entity to be updated or created.

        Returns:

            int: The updated or newly created entity's id.

        """

        await self.__session.merge(entity)

        await self.__session.commit()

        return entity.id

2) Есть вопрос небольшой: у меня есть слой сервисов, который будет получать DTO в зависимости от типа объекта и делать разные манипуляции. Так вот, чтобы обратно смаппить entity из БД в dto из слоя сервисов, нам нужно модели БД также унаследовать от BaseModel от pydantic, верно?

Интересно было бы сравнить скорость работы с async и без него именно в случае SQLAlchemy. Существуют ли такие бенчи?

а зачем? и так ведь понятно, что без асинхронности при больших рпс и сложных запросах все застопорится

Спасибо за статью.

Есть вопрос по реализации декоратора connection. Он же находится просто внутри модуля, а не внутри какого-то класса, поэтому ссылки на инстанс self из него надо убрать, а порождать сессии в контекстом менеджере через:
async with async_session_maker() as session:

Когда вы используете команду SET TRANSACTION ISOLATION LEVEL, как распространяется уровень изоляции? На текущую сессию, подключение или тп? Или вообще на всю БД в дальнейшем?

Изоляцию вы так не измените. Нужно что-то вроде этого

@asynccontextmanager
async def get_session(self, isolation_level: IsolationLevel | None = None) -> AsyncGenerator[AsyncSession, None]:
    async with self.session_factory() as session:
        if isolation_level:
            await session.connection(execution_options=dict(isolation_level=isolation_level.value))
        yield session

Зарегистрируйтесь на Хабре, чтобы оставить комментарий