SQLAlchemy 2.0 обработка ошибки Integrity error

Возник такой вопрос при отлове ошибок именно с Integrity Error

При методах update или insert(create) бывают такие случаи у пользователей, что при создании они столкнулись с ошибкой уникальности их имени или почты. Ну и конечно, алхимия выдает исключение, что запись с данной почтой есть, и нарушается уникальность. Но проблема в том, что в integrity error входят не только проблемы уникальности, и мне надо быть уверенным, что я обработал именно ошибку уникальности, а не каких-то других проблем. Вот примерный код:

async def update(self, data: dict, **filters) -> Company:
    async with async_session() as session:
        query = (
            update(Company).values(**data).filter_by(**filters).returning(Company)
        )

        try:
            result = await session.execute(query)
            await session.commit()
            return result.scalar_one()

        except exc.NoResultFound:
            raise CompanyNotFoundError 

        except exc.IntegrityError as e:
            logger.error(e)
            await session.rollback()
            raise IntegrityViolationError

И метод создания, к примеру, той же компании:

async def update(self, data: dict, **filters) -> Company:
    async with async_session() as session:
        query = (
            update(Company).values(**data).filter_by(**filters).returning(Company)
        )

        try:
            result = await session.execute(query)
            await session.commit()
            return result.scalar_one()

        except exc.NoResultFound:
            raise CompanyNotFoundError 

        except exc.IntegrityError as e:
            logger.error(e)
            await session.rollback()
            raise IntegrityViolationError

Чем я не доволен? Многим, потому что мне все равно придется на уровне контроллеров и презентабельной части выводить "к сожалению данный пользователь уже существует", а не "ошибка при создании записи, данная запись нарушает целостность базы, тем, что ключ уже существует".


Ответы (0 шт):