``logging.getLogger('sqlalchemy.orm.unitofwork').setLevel(logging.DEBUG)``.
extension
- An optional [sqlalchemy.orm.session#SessionExtension] instance, which
+ An optional [sqlalchemy.orm.session#SessionExtension] instance, or
+ a list of such instances, which
will receive pre- and post- commit and flush events, as well as a
post-rollback event. User- defined code may be placed within these
hooks using a user-defined subclass of ``SessionExtension``.
self._connections[conn] = self._connections[conn.engine] = \
(conn, transaction, conn is not bind)
- if self.session.extension is not None:
- self.session.extension.after_begin(self.session, self, conn)
+ for ext in self.session.extensions:
+ ext.after_begin(self.session, self, conn)
return conn
def prepare(self):
def _prepare_impl(self):
self._assert_is_active()
- if (self.session.extension is not None and
- (self._parent is None or self.nested)):
- self.session.extension.before_commit(self.session)
+ if self._parent is None or self.nested:
+ for ext in self.session.extensions:
+ ext.before_commit(self.session)
stx = self.session.transaction
if stx is not self:
for t in set(self._connections.values()):
t[1].commit()
- if self.session.extension is not None:
- self.session.extension.after_commit(self.session)
+ for ext in self.session.extensions:
+ ext.after_commit(self.session)
if self.session._enable_transaction_accounting:
self._remove_snapshot()
if self.session._enable_transaction_accounting:
self._restore_snapshot()
- if self.session.extension is not None:
- self.session.extension.after_rollback(self.session)
+ for ext in self.session.extensions:
+ ext.after_rollback(self.session)
def _deactivate(self):
self._active = False
self.expire_on_commit = expire_on_commit
self._enable_transaction_accounting = _enable_transaction_accounting
self.twophase = twophase
- self.extension = extension
+ self.extensions = util.to_list(extension) or []
self._query_cls = query_cls
self._mapper_flush_opts = {}
state.session_id, self.hash_key))
if state.session_id != self.hash_key:
state.session_id = self.hash_key
- if self.extension is not None:
- self.extension.after_attach(self, state.obj())
+ for ext in self.extensions:
+ ext.after_attach(self, state.obj())
def __contains__(self, instance):
"""Return True if the instance is associated with this session.
flush_context = UOWTransaction(self)
- if self.extension is not None:
- self.extension.before_flush(self, flush_context, objects)
+ for ext in self.extensions:
+ ext.before_flush(self, flush_context, objects)
deleted = set(self._deleted)
new = set(self._new)
try:
flush_context.execute()
- if self.extension is not None:
- self.extension.after_flush(self, flush_context)
+ for ext in self.extensions:
+ ext.after_flush(self, flush_context)
transaction.commit()
except:
transaction.rollback()
if not objects:
self.identity_map.modified = False
- if self.extension is not None:
- self.extension.after_flush_postexec(self, flush_context)
+ for ext in self.extensions:
+ ext.after_flush_postexec(self, flush_context)
def is_modified(self, instance, include_collections=True, passive=False):
"""Return True if instance has modified attributes.