save and update

This commit is contained in:
Jakub Miazek 2023-03-29 21:43:25 +02:00
parent 30267c782a
commit 1c2223424d

View File

@ -1,5 +1,6 @@
from typing import Any from typing import Any
from asyncpg import UniqueViolationError
from fastapi import HTTPException, status from fastapi import HTTPException, status
from sqlalchemy.exc import SQLAlchemyError, IntegrityError from sqlalchemy.exc import SQLAlchemyError, IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
@ -68,17 +69,16 @@ class Base:
await self.save(db_session) await self.save(db_session)
async def save_or_update(self, db: AsyncSession): async def save_or_update(self, db: AsyncSession):
# TODO: this will be successor of update meth
_success = False
try: try:
db.add(self) db.add(self)
_success = await db.commit() return await db.commit()
return _success
except IntegrityError as exception: except IntegrityError as exception:
if not _success: if isinstance(exception.orig, UniqueViolationError):
# TODO: check if exception is instance of class 'asyncpg.exceptions.UniqueViolationError'
return await db.merge(self) return await db.merge(self)
else: else:
raise exception raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=repr(exception),
)
finally: finally:
await db.close() await db.close()