Комментарии 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
Асинхронный SQLAlchemy 2: улучшение кода, методы обновления и удаления данных