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)