My project is based on standard SQLAlchemy scaffold, ZTE, using ORM. 
Pyramid 1.5.8.

I'm trying to catch an IntegrityError (unique key constraint), I've made a 
very minimal example

@view_config(route_name='exception_test', renderer='json')
def exception_test(request):
    user = DBSession.query(User).filter(User.id == 1).first()
    user.tutorial_done = True

    DBSession.query(Map).first()

    map_obj = Map(user=request.user)
    map_obj.name = u'a'
    map_obj.slug = 'a'

    try:
        DBSession.add(map_obj)
        DBSession.flush()

    except Exception:
        return {'success': False}

    return {
        'id': map_obj.id,
        'success': True
    }


This results in a InvalidRequestError, which cannot be catched, even with 
an except Exception.

04:34:25,180 ERROR [waitress] Exception when serving /exception_test
Traceback (most recent call last):
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/waitress/channel.py",
 
line 336, in service
    task.service()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/waitress/task.py",
 
line 169, in service
    self.execute()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/waitress/task.py",
 
line 388, in execute
    app_iter = self.channel.server.application(env, start_response)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/paste/translogger.py",
 
line 69, in __call__
    return self.application(environ, replacement_start_response)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid/router.py",
 
line 242, in __call__
    response = self.invoke_subrequest(request, use_tweens=True)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid/router.py",
 
line 217, in invoke_subrequest
    response = handle_request(request)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid/tweens.py",
 
line 21, in excview_tween
    response = handler(request)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid_tm/__init__.py",
 
line 101, in tm_tween
    reraise(*exc_info)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid_tm/__init__.py",
 
line 90, in tm_tween
    manager.commit()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_manager.py",
 
line 111, in commit
    return self.get().commit()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 280, in commit
    reraise(t, v, tb)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 271, in commit
    self._commitResources()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 417, in _commitResources
    reraise(t, v, tb)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 394, in _commitResources
    rm.tpc_vote(self)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/zope/sqlalchemy/datamanager.py",
 
line 103, in tpc_vote
    self.tx.commit()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 
line 390, in commit
    self._assert_active(prepared_ok=True)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 
line 214, in _assert_active
    % self._rollback_exception
InvalidRequestError: This Session's transaction has been rolled back due to 
a previous exception during flush. To begin a new transaction with this 
Session, first issue Session.rollback(). Original exception was: 
(psycopg2.IntegrityError) duplicate key value violates unique constraint 
"uq_maps_user_id"
DETAIL:  Key (user_id, slug)=(1, a) already exists.

If I put a DBSession.rollback() in the exception block, it results in:

04:37:58,625 ERROR [waitress] Exception when serving /exception_test
Traceback (most recent call last):
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/waitress/channel.py",
 
line 336, in service
    task.service()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/waitress/task.py",
 
line 169, in service
    self.execute()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/waitress/task.py",
 
line 388, in execute
    app_iter = self.channel.server.application(env, start_response)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/paste/translogger.py",
 
line 69, in __call__
    return self.application(environ, replacement_start_response)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid/router.py",
 
line 242, in __call__
    response = self.invoke_subrequest(request, use_tweens=True)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid/router.py",
 
line 217, in invoke_subrequest
    response = handle_request(request)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid/tweens.py",
 
line 21, in excview_tween
    response = handler(request)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid_tm/__init__.py",
 
line 101, in tm_tween
    reraise(*exc_info)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/pyramid_tm/__init__.py",
 
line 90, in tm_tween
    manager.commit()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_manager.py",
 
line 111, in commit
    return self.get().commit()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 280, in commit
    reraise(t, v, tb)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 271, in commit
    self._commitResources()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 417, in _commitResources
    reraise(t, v, tb)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/transaction/_transaction.py",
 
line 394, in _commitResources
    rm.tpc_vote(self)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/zope/sqlalchemy/datamanager.py",
 
line 103, in tpc_vote
    self.tx.commit()
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 
line 390, in commit
    self._assert_active(prepared_ok=True)
  File 
"/Users/user/.virtualenvs/maphub_web/lib/python2.7/site-packages/sqlalchemy/orm/session.py",
 
line 223, in _assert_active
    raise sa_exc.ResourceClosedError(closed_msg)
ResourceClosedError: This transaction is closed


Moreover, the weird part is that it all seems to depend on seemingly 
meaningless (to me at least) order of the queries:

Moving the query(Map) to be before user.tutorial_done

user = DBSession.query(User).filter(User.id == 1).first()
DBSession.query(Map).first()
user.tutorial_done = True

Results in the correct, catchable IntegrityError.

However, removing the .filter() part makes it broken again:

user = DBSession.query(User).first()
DBSession.query(Map).first()
user.tutorial_done = True

What is happening here? I'm totally confused. Is this a bug in ZTE or 
SQLAlchemy? How can I possibly run into an uncatchable exception in a view, 
and if I do, what am I supposed to do?




-- 
You received this message because you are subscribed to the Google Groups 
"pylons-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pylons-devel+unsubscr...@googlegroups.com.
To post to this group, send email to pylons-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/pylons-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to