sqlspec 0.9.0__py3-none-any.whl → 0.9.1__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.

@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  import re
3
- from typing import TYPE_CHECKING, Any, Optional, Union, cast
3
+ from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
4
4
 
5
5
  from asyncpg import Connection
6
6
  from typing_extensions import TypeAlias
@@ -10,6 +10,8 @@ from sqlspec.exceptions import SQLParsingError
10
10
  from sqlspec.statement import PARAM_REGEX, SQLStatement
11
11
 
12
12
  if TYPE_CHECKING:
13
+ from collections.abc import Sequence
14
+
13
15
  from asyncpg.connection import Connection
14
16
  from asyncpg.pool import PoolConnectionProxy
15
17
 
@@ -196,6 +198,28 @@ class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
196
198
  # No parameters provided and none found in SQL, return original SQL from SQLStatement and empty tuple
197
199
  return sql, () # asyncpg expects a sequence, even if empty
198
200
 
201
+ @overload
202
+ async def select(
203
+ self,
204
+ sql: str,
205
+ parameters: "Optional[StatementParameterType]" = None,
206
+ /,
207
+ *,
208
+ connection: "Optional[AsyncpgConnection]" = None,
209
+ schema_type: None = None,
210
+ **kwargs: Any,
211
+ ) -> "Sequence[dict[str, Any]]": ...
212
+ @overload
213
+ async def select(
214
+ self,
215
+ sql: str,
216
+ parameters: "Optional[StatementParameterType]" = None,
217
+ /,
218
+ *,
219
+ connection: "Optional[AsyncpgConnection]" = None,
220
+ schema_type: "type[ModelDTOT]",
221
+ **kwargs: Any,
222
+ ) -> "Sequence[ModelDTOT]": ...
199
223
  async def select(
200
224
  self,
201
225
  sql: str,
@@ -205,7 +229,7 @@ class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
205
229
  connection: Optional["AsyncpgConnection"] = None,
206
230
  schema_type: "Optional[type[ModelDTOT]]" = None,
207
231
  **kwargs: Any,
208
- ) -> "list[Union[ModelDTOT, dict[str, Any]]]":
232
+ ) -> "Sequence[Union[ModelDTOT, dict[str, Any]]]":
209
233
  """Fetch data from the database.
210
234
 
211
235
  Args:
@@ -229,6 +253,28 @@ class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
229
253
  return [dict(row.items()) for row in results] # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
230
254
  return [cast("ModelDTOT", schema_type(**dict(row.items()))) for row in results] # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
231
255
 
256
+ @overload
257
+ async def select_one(
258
+ self,
259
+ sql: str,
260
+ parameters: "Optional[StatementParameterType]" = None,
261
+ /,
262
+ *,
263
+ connection: "Optional[AsyncpgConnection]" = None,
264
+ schema_type: None = None,
265
+ **kwargs: Any,
266
+ ) -> "dict[str, Any]": ...
267
+ @overload
268
+ async def select_one(
269
+ self,
270
+ sql: str,
271
+ parameters: "Optional[StatementParameterType]" = None,
272
+ /,
273
+ *,
274
+ connection: "Optional[AsyncpgConnection]" = None,
275
+ schema_type: "type[ModelDTOT]",
276
+ **kwargs: Any,
277
+ ) -> "ModelDTOT": ...
232
278
  async def select_one(
233
279
  self,
234
280
  sql: str,
@@ -262,6 +308,28 @@ class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
262
308
  return dict(result.items()) # type: ignore[attr-defined]
263
309
  return cast("ModelDTOT", schema_type(**dict(result.items()))) # type: ignore[attr-defined]
264
310
 
311
+ @overload
312
+ async def select_one_or_none(
313
+ self,
314
+ sql: str,
315
+ parameters: "Optional[StatementParameterType]" = None,
316
+ /,
317
+ *,
318
+ connection: "Optional[AsyncpgConnection]" = None,
319
+ schema_type: None = None,
320
+ **kwargs: Any,
321
+ ) -> "Optional[dict[str, Any]]": ...
322
+ @overload
323
+ async def select_one_or_none(
324
+ self,
325
+ sql: str,
326
+ parameters: "Optional[StatementParameterType]" = None,
327
+ /,
328
+ *,
329
+ connection: "Optional[AsyncpgConnection]" = None,
330
+ schema_type: "type[ModelDTOT]",
331
+ **kwargs: Any,
332
+ ) -> "Optional[ModelDTOT]": ...
265
333
  async def select_one_or_none(
266
334
  self,
267
335
  sql: str,
@@ -295,6 +363,28 @@ class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
295
363
  return dict(result.items())
296
364
  return cast("ModelDTOT", schema_type(**dict(result.items())))
297
365
 
366
+ @overload
367
+ async def select_value(
368
+ self,
369
+ sql: str,
370
+ parameters: "Optional[StatementParameterType]" = None,
371
+ /,
372
+ *,
373
+ connection: "Optional[AsyncpgConnection]" = None,
374
+ schema_type: None = None,
375
+ **kwargs: Any,
376
+ ) -> "Any": ...
377
+ @overload
378
+ async def select_value(
379
+ self,
380
+ sql: str,
381
+ parameters: "Optional[StatementParameterType]" = None,
382
+ /,
383
+ *,
384
+ connection: "Optional[AsyncpgConnection]" = None,
385
+ schema_type: "type[T]",
386
+ **kwargs: Any,
387
+ ) -> "T": ...
298
388
  async def select_value(
299
389
  self,
300
390
  sql: str,
@@ -326,6 +416,28 @@ class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
326
416
  return result
327
417
  return schema_type(result) # type: ignore[call-arg]
328
418
 
419
+ @overload
420
+ async def select_value_or_none(
421
+ self,
422
+ sql: str,
423
+ parameters: "Optional[StatementParameterType]" = None,
424
+ /,
425
+ *,
426
+ connection: "Optional[AsyncpgConnection]" = None,
427
+ schema_type: None = None,
428
+ **kwargs: Any,
429
+ ) -> "Optional[Any]": ...
430
+ @overload
431
+ async def select_value_or_none(
432
+ self,
433
+ sql: str,
434
+ parameters: "Optional[StatementParameterType]" = None,
435
+ /,
436
+ *,
437
+ connection: "Optional[AsyncpgConnection]" = None,
438
+ schema_type: "type[T]",
439
+ **kwargs: Any,
440
+ ) -> "Optional[T]": ...
329
441
  async def select_value_or_none(
330
442
  self,
331
443
  sql: str,
@@ -381,6 +493,28 @@ class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
381
493
  except (ValueError, IndexError, AttributeError):
382
494
  return -1 # Fallback if we can't parse the status
383
495
 
496
+ @overload
497
+ async def insert_update_delete_returning(
498
+ self,
499
+ sql: str,
500
+ parameters: "Optional[StatementParameterType]" = None,
501
+ /,
502
+ *,
503
+ connection: "Optional[AsyncpgConnection]" = None,
504
+ schema_type: None = None,
505
+ **kwargs: Any,
506
+ ) -> "dict[str, Any]": ...
507
+ @overload
508
+ async def insert_update_delete_returning(
509
+ self,
510
+ sql: str,
511
+ parameters: "Optional[StatementParameterType]" = None,
512
+ /,
513
+ *,
514
+ connection: "Optional[AsyncpgConnection]" = None,
515
+ schema_type: "type[ModelDTOT]",
516
+ **kwargs: Any,
517
+ ) -> "ModelDTOT": ...
384
518
  async def insert_update_delete_returning(
385
519
  self,
386
520
  sql: str,
@@ -1,10 +1,10 @@
1
1
  from contextlib import contextmanager
2
- from typing import TYPE_CHECKING, Any, Optional, Union, cast
2
+ from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
3
3
 
4
4
  from sqlspec.base import SyncArrowBulkOperationsMixin, SyncDriverAdapterProtocol, T
5
5
 
6
6
  if TYPE_CHECKING:
7
- from collections.abc import Generator
7
+ from collections.abc import Generator, Sequence
8
8
 
9
9
  from duckdb import DuckDBPyConnection
10
10
 
@@ -42,17 +42,38 @@ class DuckDBDriver(SyncArrowBulkOperationsMixin["DuckDBPyConnection"], SyncDrive
42
42
  yield connection
43
43
 
44
44
  # --- Public API Methods --- #
45
-
45
+ @overload
46
46
  def select(
47
47
  self,
48
48
  sql: str,
49
- parameters: Optional["StatementParameterType"] = None,
49
+ parameters: "Optional[StatementParameterType]" = None,
50
50
  /,
51
51
  *,
52
- connection: Optional["DuckDBPyConnection"] = None,
52
+ connection: "Optional[DuckDBPyConnection]" = None,
53
+ schema_type: None = None,
54
+ **kwargs: Any,
55
+ ) -> "Sequence[dict[str, Any]]": ...
56
+ @overload
57
+ def select(
58
+ self,
59
+ sql: str,
60
+ parameters: "Optional[StatementParameterType]" = None,
61
+ /,
62
+ *,
63
+ connection: "Optional[DuckDBPyConnection]" = None,
64
+ schema_type: "type[ModelDTOT]",
65
+ **kwargs: Any,
66
+ ) -> "Sequence[ModelDTOT]": ...
67
+ def select(
68
+ self,
69
+ sql: str,
70
+ parameters: "Optional[StatementParameterType]" = None,
71
+ /,
72
+ *,
73
+ connection: "Optional[DuckDBPyConnection]" = None,
53
74
  schema_type: "Optional[type[ModelDTOT]]" = None,
54
75
  **kwargs: Any,
55
- ) -> "list[Union[ModelDTOT, dict[str, Any]]]":
76
+ ) -> "Sequence[Union[ModelDTOT, dict[str, Any]]]":
56
77
  connection = self._connection(connection)
57
78
  sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
58
79
  with self._with_cursor(connection) as cursor:
@@ -67,6 +88,28 @@ class DuckDBDriver(SyncArrowBulkOperationsMixin["DuckDBPyConnection"], SyncDrive
67
88
  return [cast("ModelDTOT", schema_type(**dict(zip(column_names, row)))) for row in results] # pyright: ignore[reportUnknownArgumentType]
68
89
  return [dict(zip(column_names, row)) for row in results] # pyright: ignore[reportUnknownArgumentType]
69
90
 
91
+ @overload
92
+ def select_one(
93
+ self,
94
+ sql: str,
95
+ parameters: "Optional[StatementParameterType]" = None,
96
+ /,
97
+ *,
98
+ connection: "Optional[DuckDBPyConnection]" = None,
99
+ schema_type: None = None,
100
+ **kwargs: Any,
101
+ ) -> "dict[str, Any]": ...
102
+ @overload
103
+ def select_one(
104
+ self,
105
+ sql: str,
106
+ parameters: "Optional[StatementParameterType]" = None,
107
+ /,
108
+ *,
109
+ connection: "Optional[DuckDBPyConnection]" = None,
110
+ schema_type: "type[ModelDTOT]",
111
+ **kwargs: Any,
112
+ ) -> "ModelDTOT": ...
70
113
  def select_one(
71
114
  self,
72
115
  sql: str,
@@ -90,6 +133,28 @@ class DuckDBDriver(SyncArrowBulkOperationsMixin["DuckDBPyConnection"], SyncDrive
90
133
  # Always return dictionaries
91
134
  return dict(zip(column_names, result)) # pyright: ignore[reportUnknownArgumentType,reportUnknownVariableType]
92
135
 
136
+ @overload
137
+ def select_one_or_none(
138
+ self,
139
+ sql: str,
140
+ parameters: "Optional[StatementParameterType]" = None,
141
+ /,
142
+ *,
143
+ connection: "Optional[DuckDBPyConnection]" = None,
144
+ schema_type: None = None,
145
+ **kwargs: Any,
146
+ ) -> "Optional[dict[str, Any]]": ...
147
+ @overload
148
+ def select_one_or_none(
149
+ self,
150
+ sql: str,
151
+ parameters: "Optional[StatementParameterType]" = None,
152
+ /,
153
+ *,
154
+ connection: "Optional[DuckDBPyConnection]" = None,
155
+ schema_type: "type[ModelDTOT]",
156
+ **kwargs: Any,
157
+ ) -> "Optional[ModelDTOT]": ...
93
158
  def select_one_or_none(
94
159
  self,
95
160
  sql: str,
@@ -113,6 +178,28 @@ class DuckDBDriver(SyncArrowBulkOperationsMixin["DuckDBPyConnection"], SyncDrive
113
178
  return cast("ModelDTOT", schema_type(**dict(zip(column_names, result)))) # pyright: ignore[reportUnknownArgumentType]
114
179
  return dict(zip(column_names, result)) # pyright: ignore[reportUnknownArgumentType,reportUnknownVariableType]
115
180
 
181
+ @overload
182
+ def select_value(
183
+ self,
184
+ sql: str,
185
+ parameters: "Optional[StatementParameterType]" = None,
186
+ /,
187
+ *,
188
+ connection: "Optional[DuckDBPyConnection]" = None,
189
+ schema_type: None = None,
190
+ **kwargs: Any,
191
+ ) -> "Any": ...
192
+ @overload
193
+ def select_value(
194
+ self,
195
+ sql: str,
196
+ parameters: "Optional[StatementParameterType]" = None,
197
+ /,
198
+ *,
199
+ connection: "Optional[DuckDBPyConnection]" = None,
200
+ schema_type: "type[T]",
201
+ **kwargs: Any,
202
+ ) -> "T": ...
116
203
  def select_value(
117
204
  self,
118
205
  sql: str,
@@ -133,6 +220,28 @@ class DuckDBDriver(SyncArrowBulkOperationsMixin["DuckDBPyConnection"], SyncDrive
133
220
  return result[0] # pyright: ignore
134
221
  return schema_type(result[0]) # type: ignore[call-arg]
135
222
 
223
+ @overload
224
+ def select_value_or_none(
225
+ self,
226
+ sql: str,
227
+ parameters: "Optional[StatementParameterType]" = None,
228
+ /,
229
+ *,
230
+ connection: "Optional[DuckDBPyConnection]" = None,
231
+ schema_type: None = None,
232
+ **kwargs: Any,
233
+ ) -> "Optional[Any]": ...
234
+ @overload
235
+ def select_value_or_none(
236
+ self,
237
+ sql: str,
238
+ parameters: "Optional[StatementParameterType]" = None,
239
+ /,
240
+ *,
241
+ connection: "Optional[DuckDBPyConnection]" = None,
242
+ schema_type: "type[T]",
243
+ **kwargs: Any,
244
+ ) -> "Optional[T]": ...
136
245
  def select_value_or_none(
137
246
  self,
138
247
  sql: str,
@@ -169,23 +278,44 @@ class DuckDBDriver(SyncArrowBulkOperationsMixin["DuckDBPyConnection"], SyncDrive
169
278
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
170
279
  return getattr(cursor, "rowcount", -1) # pyright: ignore[reportUnknownMemberType]
171
280
 
281
+ @overload
172
282
  def insert_update_delete_returning(
173
283
  self,
174
284
  sql: str,
175
- parameters: Optional["StatementParameterType"] = None,
285
+ parameters: "Optional[StatementParameterType]" = None,
176
286
  /,
177
287
  *,
178
- connection: Optional["DuckDBPyConnection"] = None,
288
+ connection: "Optional[DuckDBPyConnection]" = None,
289
+ schema_type: None = None,
290
+ **kwargs: Any,
291
+ ) -> "dict[str, Any]": ...
292
+ @overload
293
+ def insert_update_delete_returning(
294
+ self,
295
+ sql: str,
296
+ parameters: "Optional[StatementParameterType]" = None,
297
+ /,
298
+ *,
299
+ connection: "Optional[DuckDBPyConnection]" = None,
300
+ schema_type: "type[ModelDTOT]",
301
+ **kwargs: Any,
302
+ ) -> "ModelDTOT": ...
303
+ def insert_update_delete_returning(
304
+ self,
305
+ sql: str,
306
+ parameters: "Optional[StatementParameterType]" = None,
307
+ /,
308
+ *,
309
+ connection: "Optional[DuckDBPyConnection]" = None,
179
310
  schema_type: "Optional[type[ModelDTOT]]" = None,
180
311
  **kwargs: Any,
181
- ) -> "Optional[Union[dict[str, Any], ModelDTOT]]":
312
+ ) -> "Union[ModelDTOT, dict[str, Any]]":
182
313
  connection = self._connection(connection)
183
314
  sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
184
315
  with self._with_cursor(connection) as cursor:
185
316
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
186
317
  result = cursor.fetchall() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
187
- if not result:
188
- return None # pyright: ignore[reportUnknownArgumentType]
318
+ result = self.check_not_found(result) # pyright: ignore
189
319
  column_names = [col[0] for col in cursor.description or []] # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType]
190
320
  if schema_type is not None:
191
321
  return cast("ModelDTOT", schema_type(**dict(zip(column_names, result[0])))) # pyright: ignore[reportUnknownArgumentType]