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