From: dankrzeminski32 Date: Mon, 24 Jul 2023 19:16:01 +0000 (-0500) Subject: added close_final impl to Session and SessionTransaction X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f7b388202766bfe214b3ffb4e174ec8cee50f82;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git added close_final impl to Session and SessionTransaction --- diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 8d19e2374e..28e4b5cbc6 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -878,6 +878,12 @@ class SessionTransaction(_StateChange, TransactionalContext): self.nested = nested = origin is SessionTransactionOrigin.BEGIN_NESTED self.origin = origin + if session._is_closed: + raise sa_exc.InvalidRequestError( + "This Session has been permanently closed and is unable " + "to handle any more transaction requests." + ) + if nested: if not parent: raise sa_exc.InvalidRequestError( @@ -1429,6 +1435,7 @@ class Session(_SessionClassMethods, EventTarget): query_cls: Optional[Type[Query[Any]]] = None, autocommit: Literal[False] = False, join_transaction_mode: JoinTransactionMode = "conditional_savepoint", + close_final: bool = False ): r"""Construct a new :class:`_orm.Session`. @@ -1636,6 +1643,8 @@ class Session(_SessionClassMethods, EventTarget): .. versionadded:: 2.0.0rc1 + :param close_final: Defaults to ``False``. Determines if the the session + should be unusable after a call to ``.close()`` is made. """ # noqa @@ -1668,6 +1677,8 @@ class Session(_SessionClassMethods, EventTarget): self.autoflush = autoflush self.expire_on_commit = expire_on_commit self.enable_baked_queries = enable_baked_queries + self.close_final = close_final + self._is_closed = False if ( join_transaction_mode and join_transaction_mode @@ -2433,6 +2444,8 @@ class Session(_SessionClassMethods, EventTarget): self._close_impl(invalidate=True) def _close_impl(self, invalidate: bool) -> None: + if self.close_final: + self._is_closed = True self.expunge_all() if self._transaction is not None: for transaction in self._transaction._iterate_self_and_parents():