]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
apply correct type to orm connection.execution_options
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 4 Aug 2023 00:14:39 +0000 (20:14 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 4 Aug 2023 14:02:14 +0000 (10:02 -0400)
Fixed issue in :class:`_orm.Session` and :class:`_asyncio.AsyncSession`
methods such as :meth:`_orm.Session.connection` where the
:paramref:`_orm.Session.connection.execution_options` parameter were
hardcoded to an internal type that is not user-facing.

Fixes: #10182
Change-Id: Iab9d510bf182c7dfc0521c948cf63396d05078e5

doc/build/changelog/unreleased_20/10182.rst [new file with mode: 0644]
lib/sqlalchemy/ext/asyncio/scoping.py
lib/sqlalchemy/ext/asyncio/session.py
lib/sqlalchemy/orm/scoping.py
lib/sqlalchemy/orm/session.py
test/typing/plain_files/orm/session.py

diff --git a/doc/build/changelog/unreleased_20/10182.rst b/doc/build/changelog/unreleased_20/10182.rst
new file mode 100644 (file)
index 0000000..74e4a25
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: bug, typing
+    :tickets: 10182
+
+    Fixed issue in :class:`_orm.Session` and :class:`_asyncio.AsyncSession`
+    methods such as :meth:`_orm.Session.connection` where the
+    :paramref:`_orm.Session.connection.execution_options` parameter were
+    hardcoded to an internal type that is not user-facing.
index ec99a20238825b2bb3893b91afe13cc03dc7b08d..155da8f4c9d6b28cf68efb85a073be18e12d9869 100644 (file)
@@ -43,7 +43,7 @@ if TYPE_CHECKING:
     from ...engine import Row
     from ...engine import RowMapping
     from ...engine.interfaces import _CoreAnyExecuteParams
-    from ...engine.interfaces import _ExecuteOptions
+    from ...engine.interfaces import CoreExecuteOptionsParameter
     from ...engine.result import ScalarResult
     from ...orm._typing import _IdentityKeyType
     from ...orm._typing import _O
@@ -488,7 +488,7 @@ class async_scoped_session(Generic[_AS]):
     async def connection(
         self,
         bind_arguments: Optional[_BindArguments] = None,
-        execution_options: Optional[_ExecuteOptions] = None,
+        execution_options: Optional[CoreExecuteOptionsParameter] = None,
         **kw: Any,
     ) -> AsyncConnection:
         r"""Return a :class:`_asyncio.AsyncConnection` object corresponding to
index 02631cfebf15466bfc5fe69059035080c1a2395b..3d176b4e7b26d4b794a212fb689981e4f7666378 100644 (file)
@@ -48,7 +48,7 @@ if TYPE_CHECKING:
     from ...engine import RowMapping
     from ...engine import ScalarResult
     from ...engine.interfaces import _CoreAnyExecuteParams
-    from ...engine.interfaces import _ExecuteOptions
+    from ...engine.interfaces import CoreExecuteOptionsParameter
     from ...event import dispatcher
     from ...orm._typing import _IdentityKeyType
     from ...orm._typing import _O
@@ -870,7 +870,7 @@ class AsyncSession(ReversibleProxy[Session]):
     async def connection(
         self,
         bind_arguments: Optional[_BindArguments] = None,
-        execution_options: Optional[_ExecuteOptions] = None,
+        execution_options: Optional[CoreExecuteOptionsParameter] = None,
         **kw: Any,
     ) -> AsyncConnection:
         r"""Return a :class:`_asyncio.AsyncConnection` object corresponding to
index 4230a890c1f6f706e33810492188a24cc3906c8d..2fbd4fbe517e95116199883fec7cbe1f7b9286ac 100644 (file)
@@ -55,7 +55,7 @@ if TYPE_CHECKING:
     from ..engine import RowMapping
     from ..engine.interfaces import _CoreAnyExecuteParams
     from ..engine.interfaces import _CoreSingleExecuteParams
-    from ..engine.interfaces import _ExecuteOptions
+    from ..engine.interfaces import CoreExecuteOptionsParameter
     from ..engine.result import ScalarResult
     from ..sql._typing import _ColumnsClauseArgument
     from ..sql._typing import _T0
@@ -554,7 +554,7 @@ class scoped_session(Generic[_S]):
     def connection(
         self,
         bind_arguments: Optional[_BindArguments] = None,
-        execution_options: Optional[_ExecuteOptions] = None,
+        execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> Connection:
         r"""Return a :class:`_engine.Connection` object corresponding to this
         :class:`.Session` object's transactional state.
index 8d19e2374e1c053ab6c181ab6b69d2c05a5ded19..fade4c48847fc174e64262c0155bdf6acebebc7d 100644 (file)
@@ -109,6 +109,7 @@ if typing.TYPE_CHECKING:
     from ..engine.interfaces import _CoreAnyExecuteParams
     from ..engine.interfaces import _CoreSingleExecuteParams
     from ..engine.interfaces import _ExecuteOptions
+    from ..engine.interfaces import CoreExecuteOptionsParameter
     from ..engine.result import ScalarResult
     from ..event import _InstanceLevelDispatch
     from ..sql._typing import _ColumnsClauseArgument
@@ -1089,7 +1090,7 @@ class SessionTransaction(_StateChange, TransactionalContext):
     def _connection_for_bind(
         self,
         bind: _SessionBind,
-        execution_options: Optional[_ExecuteOptions],
+        execution_options: Optional[CoreExecuteOptionsParameter],
     ) -> Connection:
         if bind in self._connections:
             if execution_options:
@@ -1939,7 +1940,7 @@ class Session(_SessionClassMethods, EventTarget):
     def connection(
         self,
         bind_arguments: Optional[_BindArguments] = None,
-        execution_options: Optional[_ExecuteOptions] = None,
+        execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> Connection:
         r"""Return a :class:`_engine.Connection` object corresponding to this
         :class:`.Session` object's transactional state.
@@ -1987,7 +1988,7 @@ class Session(_SessionClassMethods, EventTarget):
     def _connection_for_bind(
         self,
         engine: _SessionBind,
-        execution_options: Optional[_ExecuteOptions] = None,
+        execution_options: Optional[CoreExecuteOptionsParameter] = None,
         **kw: Any,
     ) -> Connection:
         TransactionalContext._trans_ctx_check(self)
index 7a26835d32b3acbc2e53508f81b1199dddee199f..0f1c35eafa13598e12b15e982388bbaf13088cbc 100644 (file)
@@ -136,3 +136,35 @@ async def test_with_for_update_async() -> None:
 
     await ss.refresh(u1)
     await ss.refresh(u1, with_for_update=True)
+
+
+def test_exec_options() -> None:
+    """test #10182"""
+
+    session = Session()
+
+    session.connection(
+        execution_options={"isolation_level": "REPEATABLE READ"}
+    )
+
+    scoped = scoped_session(sessionmaker())
+
+    scoped.connection(execution_options={"isolation_level": "REPEATABLE READ"})
+
+
+async def async_test_exec_options() -> None:
+    """test #10182"""
+
+    session = AsyncSession()
+
+    await session.connection(
+        execution_options={"isolation_level": "REPEATABLE READ"}
+    )
+
+    scoped = async_scoped_session(
+        async_sessionmaker(), scopefunc=asyncio.current_task
+    )
+
+    await scoped.connection(
+        execution_options={"isolation_level": "REPEATABLE READ"}
+    )