1717from sqlalchemy .sql .base import Executable as _Executable
1818from sqlalchemy .sql .dml import UpdateBase
1919from sqlalchemy .util .concurrency import greenlet_spawn
20- from typing_extensions import deprecated
20+ from typing_extensions import TypeVarTuple , Unpack , deprecated
2121
2222from ...orm .session import Session
2323from ...sql .base import Executable
2424from ...sql .expression import Select , SelectOfScalar
2525
2626_TSelectParam = TypeVar ("_TSelectParam" , bound = Any )
27+ _Ts = TypeVarTuple ("_Ts" )
2728
2829
2930class AsyncSession (_AsyncSession ):
@@ -33,14 +34,14 @@ class AsyncSession(_AsyncSession):
3334 @overload
3435 async def exec (
3536 self ,
36- statement : Select [_TSelectParam ],
37+ statement : Select [Unpack [ _Ts ] ],
3738 * ,
3839 params : Mapping [str , Any ] | Sequence [Mapping [str , Any ]] | None = None ,
3940 execution_options : Mapping [str , Any ] = util .EMPTY_DICT ,
4041 bind_arguments : dict [str , Any ] | None = None ,
4142 _parent_execute_state : Any | None = None ,
4243 _add_event : Any | None = None ,
43- ) -> TupleResult [_TSelectParam ]: ...
44+ ) -> TupleResult [tuple [ Unpack [ _Ts ]] ]: ...
4445
4546 @overload
4647 async def exec (
@@ -64,11 +65,11 @@ async def exec(
6465 bind_arguments : dict [str , Any ] | None = None ,
6566 _parent_execute_state : Any | None = None ,
6667 _add_event : Any | None = None ,
67- ) -> CursorResult [Any ]: ...
68+ ) -> CursorResult [Unpack [ tuple [ Any , ...]] ]: ...
6869
6970 async def exec (
7071 self ,
71- statement : Select [_TSelectParam ]
72+ statement : Select [Unpack [ _Ts ] ]
7273 | SelectOfScalar [_TSelectParam ]
7374 | Executable [_TSelectParam ]
7475 | UpdateBase ,
@@ -78,7 +79,11 @@ async def exec(
7879 bind_arguments : dict [str , Any ] | None = None ,
7980 _parent_execute_state : Any | None = None ,
8081 _add_event : Any | None = None ,
81- ) -> TupleResult [_TSelectParam ] | ScalarResult [_TSelectParam ] | CursorResult [Any ]:
82+ ) -> (
83+ TupleResult [tuple [Unpack [_Ts ]]]
84+ | ScalarResult [_TSelectParam ]
85+ | CursorResult [Unpack [tuple [Any , ...]]]
86+ ):
8287 if execution_options :
8388 execution_options = util .immutabledict (execution_options ).union (
8489 _EXECUTE_OPTIONS
@@ -96,7 +101,7 @@ async def exec(
96101 _add_event = _add_event ,
97102 )
98103 result_value = await _ensure_sync_result (
99- cast (Result [_TSelectParam ], result ), self .exec
104+ cast (Result [Unpack [ tuple [ Any , ...]] ], result ), self .exec
100105 )
101106 return result_value # type: ignore
102107
@@ -131,7 +136,7 @@ async def execute(
131136 bind_arguments : dict [str , Any ] | None = None ,
132137 _parent_execute_state : Any | None = None ,
133138 _add_event : Any | None = None ,
134- ) -> Result [Any ]:
139+ ) -> Result [Unpack [ tuple [ Any , ...]] ]:
135140 """
136141 🚨 You probably want to use `session.exec()` instead of `session.execute()`.
137142
0 commit comments