Skip to content

Commit

Permalink
Handle IntegrityError in SQLAlchemy on update, delete and improve err…
Browse files Browse the repository at this point in the history
…or message (#115)
  • Loading branch information
Alain1405 authored and lyschoening committed Feb 2, 2017
1 parent d106bd0 commit dda07fa
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions flask_potion/contrib/alchemy/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from sqlalchemy.orm.exc import NoResultFound

from flask_potion import fields
from flask_potion.contrib.alchemy.filters import FILTER_NAMES, FILTERS_BY_TYPE, SQLAlchemyBaseFilter
from flask_potion.contrib.alchemy.filters import FILTER_NAMES, FILTERS_BY_TYPE
from flask_potion.exceptions import ItemNotFound, DuplicateKey, BackendConflict
from flask_potion.instances import Pagination
from flask_potion.manager import RelationalManager
Expand Down Expand Up @@ -235,7 +235,7 @@ def create(self, properties, commit=True):
raise DuplicateKey(detail=e.orig.diag.message_detail)

if current_app.debug:
raise BackendConflict(debug_info=dict(statement=e.statement, params=e.params))
raise BackendConflict(debug_info=dict(exception_message=str(e), statement=e.statement, params=e.params))
raise BackendConflict()

after_create.send(self.resource, item=item)
Expand Down Expand Up @@ -264,17 +264,28 @@ def update(self, item, changes, commit=True):
if hasattr(e.orig, 'pgcode'):
if e.orig.pgcode == '23505': # duplicate key
raise DuplicateKey(detail=e.orig.diag.message_detail)
raise

if current_app.debug:
raise BackendConflict(debug_info=dict(exception_message=str(e), statement=e.statement, params=e.params))
raise BackendConflict()

after_update.send(self.resource, item=item, changes=actual_changes)
return item

def delete(self, item):
session = self._get_session()

before_delete.send(self.resource, item=item)

session = self._get_session()
session.delete(item)
session.commit()
try:
session.delete(item)
session.commit()
except IntegrityError as e:
session.rollback()

if current_app.debug:
raise BackendConflict(debug_info=dict(exception_message=str(e), statement=e.statement, params=e.params))
raise BackendConflict()

after_delete.send(self.resource, item=item)

Expand Down

0 comments on commit dda07fa

Please sign in to comment.