sqlspec 0.8.0__py3-none-any.whl → 0.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sqlspec might be problematic. Click here for more details.

Files changed (45) hide show
  1. sqlspec/_typing.py +39 -6
  2. sqlspec/adapters/adbc/__init__.py +2 -2
  3. sqlspec/adapters/adbc/config.py +34 -11
  4. sqlspec/adapters/adbc/driver.py +167 -108
  5. sqlspec/adapters/aiosqlite/__init__.py +2 -2
  6. sqlspec/adapters/aiosqlite/config.py +2 -2
  7. sqlspec/adapters/aiosqlite/driver.py +28 -39
  8. sqlspec/adapters/asyncmy/__init__.py +3 -3
  9. sqlspec/adapters/asyncmy/config.py +11 -12
  10. sqlspec/adapters/asyncmy/driver.py +25 -34
  11. sqlspec/adapters/asyncpg/__init__.py +5 -5
  12. sqlspec/adapters/asyncpg/config.py +17 -19
  13. sqlspec/adapters/asyncpg/driver.py +249 -93
  14. sqlspec/adapters/duckdb/__init__.py +2 -2
  15. sqlspec/adapters/duckdb/config.py +2 -2
  16. sqlspec/adapters/duckdb/driver.py +49 -49
  17. sqlspec/adapters/oracledb/__init__.py +8 -8
  18. sqlspec/adapters/oracledb/config/__init__.py +6 -6
  19. sqlspec/adapters/oracledb/config/_asyncio.py +9 -10
  20. sqlspec/adapters/oracledb/config/_sync.py +8 -9
  21. sqlspec/adapters/oracledb/driver.py +114 -41
  22. sqlspec/adapters/psqlpy/__init__.py +0 -0
  23. sqlspec/adapters/psqlpy/config.py +258 -0
  24. sqlspec/adapters/psqlpy/driver.py +335 -0
  25. sqlspec/adapters/psycopg/__init__.py +10 -5
  26. sqlspec/adapters/psycopg/config/__init__.py +6 -6
  27. sqlspec/adapters/psycopg/config/_async.py +12 -12
  28. sqlspec/adapters/psycopg/config/_sync.py +13 -13
  29. sqlspec/adapters/psycopg/driver.py +180 -218
  30. sqlspec/adapters/sqlite/__init__.py +2 -2
  31. sqlspec/adapters/sqlite/config.py +2 -2
  32. sqlspec/adapters/sqlite/driver.py +43 -41
  33. sqlspec/base.py +275 -153
  34. sqlspec/exceptions.py +30 -0
  35. sqlspec/extensions/litestar/config.py +6 -0
  36. sqlspec/extensions/litestar/handlers.py +25 -0
  37. sqlspec/extensions/litestar/plugin.py +6 -1
  38. sqlspec/statement.py +373 -0
  39. sqlspec/typing.py +10 -1
  40. {sqlspec-0.8.0.dist-info → sqlspec-0.9.0.dist-info}/METADATA +4 -1
  41. sqlspec-0.9.0.dist-info/RECORD +61 -0
  42. sqlspec-0.8.0.dist-info/RECORD +0 -57
  43. {sqlspec-0.8.0.dist-info → sqlspec-0.9.0.dist-info}/WHEEL +0 -0
  44. {sqlspec-0.8.0.dist-info → sqlspec-0.9.0.dist-info}/licenses/LICENSE +0 -0
  45. {sqlspec-0.8.0.dist-info → sqlspec-0.9.0.dist-info}/licenses/NOTICE +0 -0
@@ -1,22 +1,31 @@
1
1
  from contextlib import asynccontextmanager, contextmanager
2
2
  from typing import TYPE_CHECKING, Any, Optional, Union, cast
3
3
 
4
- from sqlspec.base import AsyncDriverAdapterProtocol, SyncDriverAdapterProtocol, T
4
+ from sqlspec.base import (
5
+ AsyncArrowBulkOperationsMixin,
6
+ AsyncDriverAdapterProtocol,
7
+ SyncArrowBulkOperationsMixin,
8
+ SyncDriverAdapterProtocol,
9
+ T,
10
+ )
11
+ from sqlspec.typing import ArrowTable, StatementParameterType
5
12
 
6
13
  if TYPE_CHECKING:
7
14
  from collections.abc import AsyncGenerator, Generator
8
15
 
9
16
  from oracledb import AsyncConnection, AsyncCursor, Connection, Cursor
10
17
 
11
- from sqlspec.typing import ModelDTOT, StatementParameterType
18
+ # Conditionally import ArrowTable for type checking
19
+ from sqlspec.typing import ModelDTOT
12
20
 
13
21
  __all__ = ("OracleAsyncDriver", "OracleSyncDriver")
14
22
 
15
23
 
16
- class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
24
+ class OracleSyncDriver(SyncArrowBulkOperationsMixin["Connection"], SyncDriverAdapterProtocol["Connection"]):
17
25
  """Oracle Sync Driver Adapter."""
18
26
 
19
27
  connection: "Connection"
28
+ dialect: str = "oracle"
20
29
 
21
30
  def __init__(self, connection: "Connection") -> None:
22
31
  self.connection = connection
@@ -35,16 +44,25 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
35
44
  sql: str,
36
45
  parameters: "Optional[StatementParameterType]" = None,
37
46
  /,
47
+ *,
38
48
  connection: "Optional[Connection]" = None,
39
49
  schema_type: "Optional[type[ModelDTOT]]" = None,
50
+ **kwargs: Any,
40
51
  ) -> "list[Union[ModelDTOT, dict[str, Any]]]":
41
52
  """Fetch data from the database.
42
53
 
54
+ Args:
55
+ sql: The SQL query string.
56
+ parameters: The parameters for the query (dict, tuple, list, or None).
57
+ connection: Optional connection override.
58
+ schema_type: Optional schema class for the result.
59
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
60
+
43
61
  Returns:
44
62
  List of row data as either model instances or dictionaries.
45
63
  """
46
64
  connection = self._connection(connection)
47
- sql, parameters = self._process_sql_params(sql, parameters)
65
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
48
66
  with self._with_cursor(connection) as cursor:
49
67
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
50
68
  results = cursor.fetchall() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
@@ -63,16 +81,25 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
63
81
  sql: str,
64
82
  parameters: "Optional[StatementParameterType]" = None,
65
83
  /,
84
+ *,
66
85
  connection: "Optional[Connection]" = None,
67
86
  schema_type: "Optional[type[ModelDTOT]]" = None,
87
+ **kwargs: Any,
68
88
  ) -> "Union[ModelDTOT, dict[str, Any]]":
69
89
  """Fetch one row from the database.
70
90
 
91
+ Args:
92
+ sql: The SQL query string.
93
+ parameters: The parameters for the query (dict, tuple, list, or None).
94
+ connection: Optional connection override.
95
+ schema_type: Optional schema class for the result.
96
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
97
+
71
98
  Returns:
72
99
  The first row of the query results.
73
100
  """
74
101
  connection = self._connection(connection)
75
- sql, parameters = self._process_sql_params(sql, parameters)
102
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
76
103
 
77
104
  with self._with_cursor(connection) as cursor:
78
105
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -92,8 +119,10 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
92
119
  sql: str,
93
120
  parameters: "Optional[StatementParameterType]" = None,
94
121
  /,
122
+ *,
95
123
  connection: "Optional[Connection]" = None,
96
124
  schema_type: "Optional[type[ModelDTOT]]" = None,
125
+ **kwargs: Any,
97
126
  ) -> "Optional[Union[ModelDTOT, dict[str, Any]]]":
98
127
  """Fetch one row from the database.
99
128
 
@@ -101,7 +130,7 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
101
130
  The first row of the query results.
102
131
  """
103
132
  connection = self._connection(connection)
104
- sql, parameters = self._process_sql_params(sql, parameters)
133
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
105
134
 
106
135
  with self._with_cursor(connection) as cursor:
107
136
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -123,8 +152,10 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
123
152
  sql: str,
124
153
  parameters: "Optional[StatementParameterType]" = None,
125
154
  /,
155
+ *,
126
156
  connection: "Optional[Connection]" = None,
127
157
  schema_type: "Optional[type[T]]" = None,
158
+ **kwargs: Any,
128
159
  ) -> "Union[T, Any]":
129
160
  """Fetch a single value from the database.
130
161
 
@@ -132,7 +163,7 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
132
163
  The first value from the first row of results, or None if no results.
133
164
  """
134
165
  connection = self._connection(connection)
135
- sql, parameters = self._process_sql_params(sql, parameters)
166
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
136
167
 
137
168
  with self._with_cursor(connection) as cursor:
138
169
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -148,8 +179,10 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
148
179
  sql: str,
149
180
  parameters: "Optional[StatementParameterType]" = None,
150
181
  /,
182
+ *,
151
183
  connection: "Optional[Connection]" = None,
152
184
  schema_type: "Optional[type[T]]" = None,
185
+ **kwargs: Any,
153
186
  ) -> "Optional[Union[T, Any]]":
154
187
  """Fetch a single value from the database.
155
188
 
@@ -157,7 +190,7 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
157
190
  The first value from the first row of results, or None if no results.
158
191
  """
159
192
  connection = self._connection(connection)
160
- sql, parameters = self._process_sql_params(sql, parameters)
193
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
161
194
 
162
195
  with self._with_cursor(connection) as cursor:
163
196
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -175,7 +208,9 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
175
208
  sql: str,
176
209
  parameters: "Optional[StatementParameterType]" = None,
177
210
  /,
211
+ *,
178
212
  connection: "Optional[Connection]" = None,
213
+ **kwargs: Any,
179
214
  ) -> int:
180
215
  """Insert, update, or delete data from the database.
181
216
 
@@ -183,7 +218,7 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
183
218
  Row count affected by the operation.
184
219
  """
185
220
  connection = self._connection(connection)
186
- sql, parameters = self._process_sql_params(sql, parameters)
221
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
187
222
 
188
223
  with self._with_cursor(connection) as cursor:
189
224
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -194,8 +229,10 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
194
229
  sql: str,
195
230
  parameters: "Optional[StatementParameterType]" = None,
196
231
  /,
232
+ *,
197
233
  connection: "Optional[Connection]" = None,
198
234
  schema_type: "Optional[type[ModelDTOT]]" = None,
235
+ **kwargs: Any,
199
236
  ) -> "Optional[Union[dict[str, Any], ModelDTOT]]":
200
237
  """Insert, update, or delete data from the database and return result.
201
238
 
@@ -203,7 +240,7 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
203
240
  The first row of results.
204
241
  """
205
242
  connection = self._connection(connection)
206
- sql, parameters = self._process_sql_params(sql, parameters)
243
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
207
244
 
208
245
  with self._with_cursor(connection) as cursor:
209
246
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -225,7 +262,9 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
225
262
  sql: str,
226
263
  parameters: "Optional[StatementParameterType]" = None,
227
264
  /,
265
+ *,
228
266
  connection: "Optional[Connection]" = None,
267
+ **kwargs: Any,
229
268
  ) -> str:
230
269
  """Execute a script.
231
270
 
@@ -233,17 +272,40 @@ class OracleSyncDriver(SyncDriverAdapterProtocol["Connection"]):
233
272
  Status message for the operation.
234
273
  """
235
274
  connection = self._connection(connection)
236
- sql, parameters = self._process_sql_params(sql, parameters)
275
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
237
276
 
238
277
  with self._with_cursor(connection) as cursor:
239
278
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
240
279
  return str(cursor.rowcount) # pyright: ignore[reportUnknownMemberType]
241
280
 
281
+ def select_arrow( # pyright: ignore[reportUnknownParameterType]
282
+ self,
283
+ sql: str,
284
+ parameters: "Optional[StatementParameterType]" = None,
285
+ /,
286
+ *,
287
+ connection: "Optional[Connection]" = None,
288
+ **kwargs: Any,
289
+ ) -> "ArrowTable": # pyright: ignore[reportUnknownVariableType]
290
+ """Execute a SQL query and return results as an Apache Arrow Table.
242
291
 
243
- class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
292
+ Returns:
293
+ An Apache Arrow Table containing the query results.
294
+ """
295
+
296
+ connection = self._connection(connection)
297
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
298
+ results = connection.fetch_df_all(sql, parameters)
299
+ return cast("ArrowTable", ArrowTable.from_arrays(arrays=results.column_arrays(), names=results.column_names())) # pyright: ignore
300
+
301
+
302
+ class OracleAsyncDriver(
303
+ AsyncArrowBulkOperationsMixin["AsyncConnection"], AsyncDriverAdapterProtocol["AsyncConnection"]
304
+ ):
244
305
  """Oracle Async Driver Adapter."""
245
306
 
246
307
  connection: "AsyncConnection"
308
+ dialect: str = "oracle"
247
309
 
248
310
  def __init__(self, connection: "AsyncConnection") -> None:
249
311
  self.connection = connection
@@ -262,8 +324,10 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
262
324
  sql: str,
263
325
  parameters: "Optional[StatementParameterType]" = None,
264
326
  /,
327
+ *,
265
328
  connection: "Optional[AsyncConnection]" = None,
266
329
  schema_type: "Optional[type[ModelDTOT]]" = None,
330
+ **kwargs: Any,
267
331
  ) -> "list[Union[ModelDTOT, dict[str, Any]]]":
268
332
  """Fetch data from the database.
269
333
 
@@ -271,7 +335,7 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
271
335
  List of row data as either model instances or dictionaries.
272
336
  """
273
337
  connection = self._connection(connection)
274
- sql, parameters = self._process_sql_params(sql, parameters)
338
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
275
339
 
276
340
  async with self._with_cursor(connection) as cursor:
277
341
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -291,8 +355,10 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
291
355
  sql: str,
292
356
  parameters: "Optional[StatementParameterType]" = None,
293
357
  /,
358
+ *,
294
359
  connection: "Optional[AsyncConnection]" = None,
295
360
  schema_type: "Optional[type[ModelDTOT]]" = None,
361
+ **kwargs: Any,
296
362
  ) -> "Union[ModelDTOT, dict[str, Any]]":
297
363
  """Fetch one row from the database.
298
364
 
@@ -300,7 +366,7 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
300
366
  The first row of the query results.
301
367
  """
302
368
  connection = self._connection(connection)
303
- sql, parameters = self._process_sql_params(sql, parameters)
369
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
304
370
 
305
371
  async with self._with_cursor(connection) as cursor:
306
372
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -319,8 +385,10 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
319
385
  sql: str,
320
386
  parameters: "Optional[StatementParameterType]" = None,
321
387
  /,
388
+ *,
322
389
  connection: "Optional[AsyncConnection]" = None,
323
390
  schema_type: "Optional[type[ModelDTOT]]" = None,
391
+ **kwargs: Any,
324
392
  ) -> "Optional[Union[ModelDTOT, dict[str, Any]]]":
325
393
  """Fetch one row from the database.
326
394
 
@@ -328,7 +396,7 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
328
396
  The first row of the query results.
329
397
  """
330
398
  connection = self._connection(connection)
331
- sql, parameters = self._process_sql_params(sql, parameters)
399
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
332
400
 
333
401
  async with self._with_cursor(connection) as cursor:
334
402
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -350,8 +418,10 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
350
418
  sql: str,
351
419
  parameters: "Optional[StatementParameterType]" = None,
352
420
  /,
421
+ *,
353
422
  connection: "Optional[AsyncConnection]" = None,
354
423
  schema_type: "Optional[type[T]]" = None,
424
+ **kwargs: Any,
355
425
  ) -> "Union[T, Any]":
356
426
  """Fetch a single value from the database.
357
427
 
@@ -359,7 +429,7 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
359
429
  The first value from the first row of results, or None if no results.
360
430
  """
361
431
  connection = self._connection(connection)
362
- sql, parameters = self._process_sql_params(sql, parameters)
432
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
363
433
 
364
434
  async with self._with_cursor(connection) as cursor:
365
435
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -375,8 +445,10 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
375
445
  sql: str,
376
446
  parameters: "Optional[StatementParameterType]" = None,
377
447
  /,
448
+ *,
378
449
  connection: "Optional[AsyncConnection]" = None,
379
450
  schema_type: "Optional[type[T]]" = None,
451
+ **kwargs: Any,
380
452
  ) -> "Optional[Union[T, Any]]":
381
453
  """Fetch a single value from the database.
382
454
 
@@ -384,7 +456,7 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
384
456
  The first value from the first row of results, or None if no results.
385
457
  """
386
458
  connection = self._connection(connection)
387
- sql, parameters = self._process_sql_params(sql, parameters)
459
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
388
460
 
389
461
  async with self._with_cursor(connection) as cursor:
390
462
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -402,7 +474,9 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
402
474
  sql: str,
403
475
  parameters: "Optional[StatementParameterType]" = None,
404
476
  /,
477
+ *,
405
478
  connection: "Optional[AsyncConnection]" = None,
479
+ **kwargs: Any,
406
480
  ) -> int:
407
481
  """Insert, update, or delete data from the database.
408
482
 
@@ -410,7 +484,7 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
410
484
  Row count affected by the operation.
411
485
  """
412
486
  connection = self._connection(connection)
413
- sql, parameters = self._process_sql_params(sql, parameters)
487
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
414
488
 
415
489
  async with self._with_cursor(connection) as cursor:
416
490
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -421,8 +495,10 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
421
495
  sql: str,
422
496
  parameters: "Optional[StatementParameterType]" = None,
423
497
  /,
498
+ *,
424
499
  connection: "Optional[AsyncConnection]" = None,
425
500
  schema_type: "Optional[type[ModelDTOT]]" = None,
501
+ **kwargs: Any,
426
502
  ) -> "Optional[Union[dict[str, Any], ModelDTOT]]":
427
503
  """Insert, update, or delete data from the database and return result.
428
504
 
@@ -430,7 +506,7 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
430
506
  The first row of results.
431
507
  """
432
508
  connection = self._connection(connection)
433
- sql, parameters = self._process_sql_params(sql, parameters)
509
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
434
510
 
435
511
  async with self._with_cursor(connection) as cursor:
436
512
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -452,7 +528,9 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
452
528
  sql: str,
453
529
  parameters: "Optional[StatementParameterType]" = None,
454
530
  /,
531
+ *,
455
532
  connection: "Optional[AsyncConnection]" = None,
533
+ **kwargs: Any,
456
534
  ) -> str:
457
535
  """Execute a script.
458
536
 
@@ -460,39 +538,34 @@ class OracleAsyncDriver(AsyncDriverAdapterProtocol["AsyncConnection"]):
460
538
  Status message for the operation.
461
539
  """
462
540
  connection = self._connection(connection)
463
- sql, parameters = self._process_sql_params(sql, parameters)
541
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
464
542
 
465
543
  async with self._with_cursor(connection) as cursor:
466
544
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
467
545
  return str(cursor.rowcount) # pyright: ignore[reportUnknownMemberType]
468
546
 
469
- async def execute_script_returning(
547
+ async def select_arrow( # pyright: ignore[reportUnknownParameterType]
470
548
  self,
471
549
  sql: str,
472
550
  parameters: "Optional[StatementParameterType]" = None,
473
551
  /,
552
+ *,
474
553
  connection: "Optional[AsyncConnection]" = None,
475
- schema_type: "Optional[type[ModelDTOT]]" = None,
476
- ) -> "Optional[Union[dict[str, Any], ModelDTOT]]":
477
- """Execute a script and return result.
554
+ **kwargs: Any,
555
+ ) -> "ArrowTable": # pyright: ignore[reportUnknownVariableType]
556
+ """Execute a SQL query asynchronously and return results as an Apache Arrow Table.
557
+
558
+ Args:
559
+ sql: The SQL query string.
560
+ parameters: Parameters for the query.
561
+ connection: Optional connection override.
562
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
478
563
 
479
564
  Returns:
480
- The first row of results.
565
+ An Apache Arrow Table containing the query results.
481
566
  """
482
- connection = self._connection(connection)
483
- sql, parameters = self._process_sql_params(sql, parameters)
484
-
485
- async with self._with_cursor(connection) as cursor:
486
- await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
487
- result = await cursor.fetchone() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
488
-
489
- if result is None:
490
- return None
491
567
 
492
- # Get column names
493
- column_names = [col[0] for col in cursor.description or []] # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType]
494
-
495
- if schema_type is not None:
496
- return cast("ModelDTOT", schema_type(**dict(zip(column_names, result)))) # pyright: ignore[reportUnknownArgumentType]
497
- # Always return dictionaries
498
- return dict(zip(column_names, result)) # pyright: ignore[reportUnknownArgumentType,reportUnknownVariableType]
568
+ connection = self._connection(connection)
569
+ sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
570
+ results = await connection.fetch_df_all(sql, parameters)
571
+ return ArrowTable.from_arrays(arrays=results.column_arrays(), names=results.column_names()) # pyright: ignore
File without changes