Hello everybody. I am experimenting with sqlalchemy and pyramid, following the tutorial steps at:
https://docs.pylonsproject.org/projects/pyramid/en/latest/quick_tutorial/databases.html The example above is a wiki, with a set of pages, every page have a 'title' and a 'body' and the 'title' have a 'unique' constraint at database level. Let's suppose that I added two pages, i.e. pages = [{id:1,title:'titleA',body:'bodyA'}, {id:2,title:'titleB',body:'bodyB'} , then I decide to update id number 2 and set title to 'titleA' which is the same as id number 1, it then raise an exception, however I can not catch the exception, even if I set up a try-catch block, however if I add a DBSession.flush() inside the try, the sql sentence is executed and therefore I can catch the exception. I am copying the code with the 'Uncaught Exception' and the code with the 'Caught Exception'. The question is: Do I have to 'flush()' everytime to be sure the sql sentence is executed, or there is a better way, or which way do you suggest to manage the exceptions ? Thanks for your time and attention. This is the python code: [...] # Change the content and redirect to the view try: from sqlalchemy.exc import IntegrityError page.title = appstruct['title'] page.body = appstruct['body'] DBSession.flush() url = self.request.route_url('wikipage_view', uid=uid) return HTTPFound(url) except IntegrityError as exc: import traceback traceback.print_exc() error = colander.Invalid(wiki_form.schema) error['title'] = exc.args[0] wiki_form.error = error wiki_form.widget.handle_error(wiki_form, error) rendered_form = wiki_form.render() return dict(page=page, form=rendered_form) [...] The tracebacks: 1. Uncaught Exception: 2019-07-27 01:29:41,231 INFO [sqlalchemy.engine.base.Engine][waitress] UPDATE wikipages SET title=? WHERE wikipages.uid = ? 2019-07-27 01:29:41,231 INFO [sqlalchemy.engine.base.Engine][waitress] ('titleA', 2) 2019-07-27 01:29:41,232 INFO [sqlalchemy.engine.base.Engine][waitress] ROLLBACK 2019-07-27 01:29:41,306 ERROR [pyramid_debugtoolbar][waitress] Uncaught sqlalchemy.exc.IntegrityError at http://127.0.0.1:6543/2/edit traceback url: http://127.0.0.1:6543/_debug_toolbar/313430303936383730393639343136/exception Traceback (most recent call last): File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context cursor, statement, parameters, context File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 550, in do_execute cursor.execute(statement, parameters) sqlite3.IntegrityError: UNIQUE constraint failed: wikipages.title The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_debugtoolbar/toolbar.py", line 257, in toolbar_tween response = _handler(request) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_debugtoolbar/panels/performance.py", line 58, in resource_timer_handler result = handler(request) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_tm/__init__.py", line 171, in tm_tween reraise(*exc_info) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_tm/compat.py", line 36, in reraise raise value File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_tm/__init__.py", line 152, in tm_tween return _finish(request, manager.commit, response) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_tm/__init__.py", line 96, in _finish reraise(*exc_info) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_tm/compat.py", line 36, in reraise raise value File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/pyramid_tm/__init__.py", line 76, in _finish finisher() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_manager.py", line 252, in commit return self.manager.commit() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_manager.py", line 131, in commit return self.get().commit() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_transaction.py", line 311, in commit reraise(t, v, tb) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_compat.py", line 50, in reraise raise value File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_transaction.py", line 302, in commit self._commitResources() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_transaction.py", line 447, in _commitResources reraise(t, v, tb) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_compat.py", line 50, in reraise raise value File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/transaction/_transaction.py", line 419, in _commitResources rm.tpc_begin(self) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/zope/sqlalchemy/datamanager.py", line 106, in tpc_begin self.session.flush() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2459, in flush self._flush(objects) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2597, in _flush transaction.rollback(_capture_exception=True) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 154, in reraise raise value File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2557, in _flush flush_context.execute() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute rec.execute(self) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute uow, File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj update, File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py", line 996, in _emit_update_statements statement, multiparams File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 988, in execute return meth(self, multiparams, params) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement distilled_params, File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context e, statement, parameters, cursor, context File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception util.raise_from_cause(sqlalchemy_exception, exc_info) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 399, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 153, in reraise raise value.with_traceback(tb) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context cursor, statement, parameters, context File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 550, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: wikipages.title [SQL: UPDATE wikipages SET title=? WHERE wikipages.uid = ?] [parameters: ('titleA', 2)] (Background on this error at: http://sqlalche.me/e/gkpj) 2. Caught Exception 2019-07-27 02:18:33,208 INFO [sqlalchemy.engine.base.Engine][waitress] UPDATE wikipages SET title=? WHERE wikipages.uid = ? 2019-07-27 02:18:33,209 INFO [sqlalchemy.engine.base.Engine][waitress] ('titleA', 2) 2019-07-27 02:18:33,209 INFO [sqlalchemy.engine.base.Engine][waitress] ROLLBACK Traceback (most recent call last): File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context cursor, statement, parameters, context File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 550, in do_execute cursor.execute(statement, parameters) sqlite3.IntegrityError: UNIQUE constraint failed: wikipages.title The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/ndiaz/tutrest/quick_tutorial/authentication/tutorial/views.py", line 228, in wikipage_edit DBSession.flush() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/scoping.py", line 162, in do return getattr(self.registry(), name)(*args, **kwargs) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2459, in flush self._flush(objects) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2597, in _flush transaction.rollback(_capture_exception=True) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 154, in reraise raise value File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 2557, in _flush flush_context.execute() File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute rec.execute(self) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute uow, File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj update, File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py", line 996, in _emit_update_statements statement, multiparams File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 988, in execute return meth(self, multiparams, params) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement distilled_params, File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context e, statement, parameters, cursor, context File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception util.raise_from_cause(sqlalchemy_exception, exc_info) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 399, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 153, in reraise raise value.with_traceback(tb) File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context cursor, statement, parameters, context File "/home/ndiaz/tutrest/env35/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 550, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: wikipages.title [SQL: UPDATE wikipages SET title=? WHERE wikipages.uid = ?] [parameters: ('titleA', 2)] (Background on this error at: http://sqlalche.me/e/gkpj) -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/57fcf1fb-818e-0df2-df4c-906bc202a26e%40gmail.com.
