The documentation provides the following example snippet for using sessions
within a context manager:
@contextmanagerdef session_scope():
"""Provide a transactional scope around a series of operations."""
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
I've been wondering why there is an except: block there. Shouldn't
session.close() be enough? At least according to the documentation, the
active transaction is rolled back by default when the connection is
returned to the pool.
This snippet has a second potential problem: what if the transaction is in
a bad state when exiting the block? Shouldn't session.commit() be skipped
then? Like, if not session.is_active: session.commit()? Let's say the user
code catches IntegrityError but doesn't roll back. The example code will
then raise an exception when it tries to commit the session transaction. Am
I missing something?
--
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 post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.