]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
allow multiparams with scalars
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 2 Mar 2023 01:44:49 +0000 (20:44 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 2 Mar 2023 01:44:49 +0000 (20:44 -0500)
Fixed bug where the :meth:`_engine.Connection.scalars` method was not typed
as allowing a multiple-parameters list, which is now supported using
insertmanyvalues operations.

Change-Id: I65e22c3bee80fc226d484ff1424421dd78520fa5

doc/build/changelog/unreleased_20/type_scalars.rst [new file with mode: 0644]
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/ext/asyncio/engine.py
test/ext/mypy/plain_files/typed_results.py

diff --git a/doc/build/changelog/unreleased_20/type_scalars.rst b/doc/build/changelog/unreleased_20/type_scalars.rst
new file mode 100644 (file)
index 0000000..d983e15
--- /dev/null
@@ -0,0 +1,6 @@
+.. change::
+    :tags: bug, typing
+
+    Fixed bug where the :meth:`_engine.Connection.scalars` method was not typed
+    as allowing a multiple-parameters list, which is now supported using
+    insertmanyvalues operations.
index f6c637aa892714e1b4f5edbfb39a321fa3604142..926a08b76fd0114051f04f12535ce5c6a6453e1a 100644 (file)
@@ -1306,7 +1306,7 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]):
     def scalars(
         self,
         statement: TypedReturnsRows[Tuple[_T]],
-        parameters: Optional[_CoreSingleExecuteParams] = None,
+        parameters: Optional[_CoreAnyExecuteParams] = None,
         *,
         execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> ScalarResult[_T]:
@@ -1316,7 +1316,7 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]):
     def scalars(
         self,
         statement: Executable,
-        parameters: Optional[_CoreSingleExecuteParams] = None,
+        parameters: Optional[_CoreAnyExecuteParams] = None,
         *,
         execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> ScalarResult[Any]:
@@ -1325,7 +1325,7 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]):
     def scalars(
         self,
         statement: Executable,
-        parameters: Optional[_CoreSingleExecuteParams] = None,
+        parameters: Optional[_CoreAnyExecuteParams] = None,
         *,
         execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> ScalarResult[Any]:
index 86e257bdd7fa76c6707474cbfd8c22947977175b..325c58bdab9cc88524a46b1e2c0f8973c6c4fdac 100644 (file)
@@ -646,7 +646,7 @@ class AsyncConnection(
     async def scalars(
         self,
         statement: TypedReturnsRows[Tuple[_T]],
-        parameters: Optional[_CoreSingleExecuteParams] = None,
+        parameters: Optional[_CoreAnyExecuteParams] = None,
         *,
         execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> ScalarResult[_T]:
@@ -656,7 +656,7 @@ class AsyncConnection(
     async def scalars(
         self,
         statement: Executable,
-        parameters: Optional[_CoreSingleExecuteParams] = None,
+        parameters: Optional[_CoreAnyExecuteParams] = None,
         *,
         execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> ScalarResult[Any]:
@@ -665,7 +665,7 @@ class AsyncConnection(
     async def scalars(
         self,
         statement: Executable,
-        parameters: Optional[_CoreSingleExecuteParams] = None,
+        parameters: Optional[_CoreAnyExecuteParams] = None,
         *,
         execution_options: Optional[CoreExecuteOptionsParameter] = None,
     ) -> ScalarResult[Any]:
index 8fd9e5cd13bc883366e3a0bbbdbe19ebfc211e2b..2e42bb655b024d1534dcd858a21685b209941f91 100644 (file)
@@ -6,6 +6,7 @@ from typing import cast
 from sqlalchemy import Column
 from sqlalchemy import column
 from sqlalchemy import create_engine
+from sqlalchemy import insert
 from sqlalchemy import Integer
 from sqlalchemy import select
 from sqlalchemy import table
@@ -249,6 +250,74 @@ async def t_async_result_scalar_accessors() -> None:
     reveal_type(r5)
 
 
+def t_result_insertmanyvalues_scalars() -> None:
+    stmt = insert(User).returning(User.id)
+
+    uids1 = connection.scalars(
+        stmt,
+        [
+            {"name": "n1"},
+            {"name": "n2"},
+            {"name": "n3"},
+        ],
+    ).all()
+
+    # EXPECTED_TYPE: Sequence[int]
+    reveal_type(uids1)
+
+    uids2 = (
+        connection.execute(
+            stmt,
+            [
+                {"name": "n1"},
+                {"name": "n2"},
+                {"name": "n3"},
+            ],
+        )
+        .scalars()
+        .all()
+    )
+
+    # EXPECTED_TYPE: Sequence[int]
+    reveal_type(uids2)
+
+
+async def t_async_result_insertmanyvalues_scalars() -> None:
+    stmt = insert(User).returning(User.id)
+
+    uids1 = (
+        await async_connection.scalars(
+            stmt,
+            [
+                {"name": "n1"},
+                {"name": "n2"},
+                {"name": "n3"},
+            ],
+        )
+    ).all()
+
+    # EXPECTED_TYPE: Sequence[int]
+    reveal_type(uids1)
+
+    uids2 = (
+        (
+            await async_connection.execute(
+                stmt,
+                [
+                    {"name": "n1"},
+                    {"name": "n2"},
+                    {"name": "n3"},
+                ],
+            )
+        )
+        .scalars()
+        .all()
+    )
+
+    # EXPECTED_TYPE: Sequence[int]
+    reveal_type(uids2)
+
+
 def t_connection_execute_multi_row_t() -> None:
     result = connection.execute(multi_stmt)