sqlspec 0.11.0__py3-none-any.whl → 0.11.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.
- sqlspec/adapters/adbc/driver.py +37 -60
- sqlspec/adapters/aiosqlite/driver.py +73 -104
- sqlspec/adapters/asyncmy/driver.py +28 -44
- sqlspec/adapters/asyncpg/driver.py +34 -44
- sqlspec/adapters/bigquery/driver.py +79 -168
- sqlspec/adapters/duckdb/driver.py +20 -49
- sqlspec/adapters/oracledb/driver.py +66 -86
- sqlspec/adapters/psqlpy/driver.py +39 -56
- sqlspec/adapters/psycopg/driver.py +71 -112
- sqlspec/adapters/sqlite/driver.py +15 -35
- sqlspec/base.py +0 -41
- sqlspec/filters.py +2 -1
- sqlspec/mixins.py +9 -10
- {sqlspec-0.11.0.dist-info → sqlspec-0.11.1.dist-info}/METADATA +4 -1
- {sqlspec-0.11.0.dist-info → sqlspec-0.11.1.dist-info}/RECORD +18 -18
- {sqlspec-0.11.0.dist-info → sqlspec-0.11.1.dist-info}/WHEEL +0 -0
- {sqlspec-0.11.0.dist-info → sqlspec-0.11.1.dist-info}/licenses/LICENSE +0 -0
- {sqlspec-0.11.0.dist-info → sqlspec-0.11.1.dist-info}/licenses/NOTICE +0 -0
|
@@ -8,14 +8,14 @@ from psycopg.rows import dict_row
|
|
|
8
8
|
|
|
9
9
|
from sqlspec.base import AsyncDriverAdapterProtocol, SyncDriverAdapterProtocol
|
|
10
10
|
from sqlspec.exceptions import ParameterStyleMismatchError
|
|
11
|
+
from sqlspec.filters import StatementFilter
|
|
11
12
|
from sqlspec.mixins import ResultConverter, SQLTranslatorMixin
|
|
12
13
|
from sqlspec.statement import SQLStatement
|
|
13
14
|
from sqlspec.typing import is_dict
|
|
14
15
|
|
|
15
16
|
if TYPE_CHECKING:
|
|
16
|
-
from collections.abc import AsyncGenerator, Generator, Sequence
|
|
17
|
+
from collections.abc import AsyncGenerator, Generator, Mapping, Sequence
|
|
17
18
|
|
|
18
|
-
from sqlspec.filters import StatementFilter
|
|
19
19
|
from sqlspec.typing import ModelDTOT, StatementParameterType, T
|
|
20
20
|
|
|
21
21
|
logger = logging.getLogger("sqlspec")
|
|
@@ -38,7 +38,6 @@ class PsycopgDriverBase:
|
|
|
38
38
|
self,
|
|
39
39
|
sql: str,
|
|
40
40
|
parameters: "Optional[StatementParameterType]" = None,
|
|
41
|
-
/,
|
|
42
41
|
*filters: "StatementFilter",
|
|
43
42
|
**kwargs: Any,
|
|
44
43
|
) -> "tuple[str, Optional[Union[tuple[Any, ...], list[Any], dict[str, Any]]]]":
|
|
@@ -56,10 +55,20 @@ class PsycopgDriverBase:
|
|
|
56
55
|
Returns:
|
|
57
56
|
A tuple of (sql, parameters) ready for execution.
|
|
58
57
|
"""
|
|
59
|
-
|
|
58
|
+
data_params_for_statement: Optional[Union[Mapping[str, Any], Sequence[Any]]] = None
|
|
59
|
+
combined_filters_list: list[StatementFilter] = list(filters)
|
|
60
|
+
|
|
61
|
+
if parameters is not None:
|
|
62
|
+
if isinstance(parameters, StatementFilter):
|
|
63
|
+
combined_filters_list.insert(0, parameters)
|
|
64
|
+
else:
|
|
65
|
+
data_params_for_statement = parameters
|
|
66
|
+
if data_params_for_statement is not None and not isinstance(data_params_for_statement, (list, tuple, dict)):
|
|
67
|
+
data_params_for_statement = (data_params_for_statement,)
|
|
68
|
+
statement = SQLStatement(sql, data_params_for_statement, kwargs=kwargs, dialect=self.dialect)
|
|
60
69
|
|
|
61
70
|
# Apply all statement filters
|
|
62
|
-
for filter_obj in
|
|
71
|
+
for filter_obj in combined_filters_list:
|
|
63
72
|
statement = statement.apply_filter(filter_obj)
|
|
64
73
|
|
|
65
74
|
processed_sql, processed_params, _ = statement.process()
|
|
@@ -118,7 +127,6 @@ class PsycopgSyncDriver(
|
|
|
118
127
|
self,
|
|
119
128
|
sql: str,
|
|
120
129
|
parameters: "Optional[StatementParameterType]" = None,
|
|
121
|
-
/,
|
|
122
130
|
*filters: "StatementFilter",
|
|
123
131
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
124
132
|
schema_type: None = None,
|
|
@@ -129,7 +137,6 @@ class PsycopgSyncDriver(
|
|
|
129
137
|
self,
|
|
130
138
|
sql: str,
|
|
131
139
|
parameters: "Optional[StatementParameterType]" = None,
|
|
132
|
-
/,
|
|
133
140
|
*filters: "StatementFilter",
|
|
134
141
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
135
142
|
schema_type: "type[ModelDTOT]",
|
|
@@ -139,7 +146,6 @@ class PsycopgSyncDriver(
|
|
|
139
146
|
self,
|
|
140
147
|
sql: str,
|
|
141
148
|
parameters: "Optional[StatementParameterType]" = None,
|
|
142
|
-
/,
|
|
143
149
|
*filters: "StatementFilter",
|
|
144
150
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
145
151
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
@@ -165,7 +171,6 @@ class PsycopgSyncDriver(
|
|
|
165
171
|
self,
|
|
166
172
|
sql: str,
|
|
167
173
|
parameters: "Optional[StatementParameterType]" = None,
|
|
168
|
-
/,
|
|
169
174
|
*filters: "StatementFilter",
|
|
170
175
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
171
176
|
schema_type: None = None,
|
|
@@ -176,7 +181,6 @@ class PsycopgSyncDriver(
|
|
|
176
181
|
self,
|
|
177
182
|
sql: str,
|
|
178
183
|
parameters: "Optional[StatementParameterType]" = None,
|
|
179
|
-
/,
|
|
180
184
|
*filters: "StatementFilter",
|
|
181
185
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
182
186
|
schema_type: "type[ModelDTOT]",
|
|
@@ -186,7 +190,6 @@ class PsycopgSyncDriver(
|
|
|
186
190
|
self,
|
|
187
191
|
sql: str,
|
|
188
192
|
parameters: "Optional[StatementParameterType]" = None,
|
|
189
|
-
/,
|
|
190
193
|
*filters: "StatementFilter",
|
|
191
194
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
192
195
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
@@ -201,17 +204,15 @@ class PsycopgSyncDriver(
|
|
|
201
204
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
202
205
|
with self._with_cursor(connection) as cursor:
|
|
203
206
|
cursor.execute(sql, parameters)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return self.to_schema(cast("dict[str, Any]", row), schema_type=schema_type)
|
|
207
|
+
result = cursor.fetchone()
|
|
208
|
+
result = self.check_not_found(result)
|
|
209
|
+
return self.to_schema(cast("dict[str, Any]", result), schema_type=schema_type)
|
|
208
210
|
|
|
209
211
|
@overload
|
|
210
212
|
def select_one_or_none(
|
|
211
213
|
self,
|
|
212
214
|
sql: str,
|
|
213
215
|
parameters: "Optional[StatementParameterType]" = None,
|
|
214
|
-
/,
|
|
215
216
|
*filters: "StatementFilter",
|
|
216
217
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
217
218
|
schema_type: None = None,
|
|
@@ -222,7 +223,6 @@ class PsycopgSyncDriver(
|
|
|
222
223
|
self,
|
|
223
224
|
sql: str,
|
|
224
225
|
parameters: "Optional[StatementParameterType]" = None,
|
|
225
|
-
/,
|
|
226
226
|
*filters: "StatementFilter",
|
|
227
227
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
228
228
|
schema_type: "type[ModelDTOT]",
|
|
@@ -232,7 +232,6 @@ class PsycopgSyncDriver(
|
|
|
232
232
|
self,
|
|
233
233
|
sql: str,
|
|
234
234
|
parameters: "Optional[StatementParameterType]" = None,
|
|
235
|
-
/,
|
|
236
235
|
*filters: "StatementFilter",
|
|
237
236
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
238
237
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
@@ -241,23 +240,22 @@ class PsycopgSyncDriver(
|
|
|
241
240
|
"""Fetch one row from the database.
|
|
242
241
|
|
|
243
242
|
Returns:
|
|
244
|
-
The first row of the query results.
|
|
243
|
+
The first row of the query results, or None if no results.
|
|
245
244
|
"""
|
|
246
245
|
connection = self._connection(connection)
|
|
247
246
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
248
247
|
with self._with_cursor(connection) as cursor:
|
|
249
248
|
cursor.execute(sql, parameters)
|
|
250
|
-
|
|
251
|
-
if
|
|
249
|
+
result = cursor.fetchone()
|
|
250
|
+
if result is None:
|
|
252
251
|
return None
|
|
253
|
-
return self.to_schema(cast("dict[str, Any]",
|
|
252
|
+
return self.to_schema(cast("dict[str, Any]", result), schema_type=schema_type)
|
|
254
253
|
|
|
255
254
|
@overload
|
|
256
255
|
def select_value(
|
|
257
256
|
self,
|
|
258
257
|
sql: str,
|
|
259
258
|
parameters: "Optional[StatementParameterType]" = None,
|
|
260
|
-
/,
|
|
261
259
|
*filters: "StatementFilter",
|
|
262
260
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
263
261
|
schema_type: None = None,
|
|
@@ -268,7 +266,6 @@ class PsycopgSyncDriver(
|
|
|
268
266
|
self,
|
|
269
267
|
sql: str,
|
|
270
268
|
parameters: "Optional[StatementParameterType]" = None,
|
|
271
|
-
/,
|
|
272
269
|
*filters: "StatementFilter",
|
|
273
270
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
274
271
|
schema_type: "type[T]",
|
|
@@ -278,7 +275,6 @@ class PsycopgSyncDriver(
|
|
|
278
275
|
self,
|
|
279
276
|
sql: str,
|
|
280
277
|
parameters: "Optional[StatementParameterType]" = None,
|
|
281
|
-
/,
|
|
282
278
|
*filters: "StatementFilter",
|
|
283
279
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
284
280
|
schema_type: "Optional[type[T]]" = None,
|
|
@@ -287,26 +283,25 @@ class PsycopgSyncDriver(
|
|
|
287
283
|
"""Fetch a single value from the database.
|
|
288
284
|
|
|
289
285
|
Returns:
|
|
290
|
-
The first value from the first row of results
|
|
286
|
+
The first value from the first row of results.
|
|
291
287
|
"""
|
|
292
288
|
connection = self._connection(connection)
|
|
293
289
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
294
290
|
with self._with_cursor(connection) as cursor:
|
|
295
291
|
cursor.execute(sql, parameters)
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
if schema_type is
|
|
301
|
-
return
|
|
302
|
-
return
|
|
292
|
+
result = cursor.fetchone()
|
|
293
|
+
result = self.check_not_found(result)
|
|
294
|
+
|
|
295
|
+
value = next(iter(result.values())) # Get the first value from the row
|
|
296
|
+
if schema_type is None:
|
|
297
|
+
return value
|
|
298
|
+
return schema_type(value) # type: ignore[call-arg]
|
|
303
299
|
|
|
304
300
|
@overload
|
|
305
301
|
def select_value_or_none(
|
|
306
302
|
self,
|
|
307
303
|
sql: str,
|
|
308
304
|
parameters: "Optional[StatementParameterType]" = None,
|
|
309
|
-
/,
|
|
310
305
|
*filters: "StatementFilter",
|
|
311
306
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
312
307
|
schema_type: None = None,
|
|
@@ -317,7 +312,6 @@ class PsycopgSyncDriver(
|
|
|
317
312
|
self,
|
|
318
313
|
sql: str,
|
|
319
314
|
parameters: "Optional[StatementParameterType]" = None,
|
|
320
|
-
/,
|
|
321
315
|
*filters: "StatementFilter",
|
|
322
316
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
323
317
|
schema_type: "type[T]",
|
|
@@ -327,7 +321,6 @@ class PsycopgSyncDriver(
|
|
|
327
321
|
self,
|
|
328
322
|
sql: str,
|
|
329
323
|
parameters: "Optional[StatementParameterType]" = None,
|
|
330
|
-
/,
|
|
331
324
|
*filters: "StatementFilter",
|
|
332
325
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
333
326
|
schema_type: "Optional[type[T]]" = None,
|
|
@@ -342,29 +335,27 @@ class PsycopgSyncDriver(
|
|
|
342
335
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
343
336
|
with self._with_cursor(connection) as cursor:
|
|
344
337
|
cursor.execute(sql, parameters)
|
|
345
|
-
|
|
346
|
-
if
|
|
347
|
-
return None
|
|
348
|
-
val = next(iter(row.values())) if row else None
|
|
349
|
-
if val is None:
|
|
338
|
+
result = cursor.fetchone()
|
|
339
|
+
if result is None:
|
|
350
340
|
return None
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
341
|
+
|
|
342
|
+
value = next(iter(result.values())) # Get the first value from the row
|
|
343
|
+
if schema_type is None:
|
|
344
|
+
return value
|
|
345
|
+
return schema_type(value) # type: ignore[call-arg]
|
|
354
346
|
|
|
355
347
|
def insert_update_delete(
|
|
356
348
|
self,
|
|
357
349
|
sql: str,
|
|
358
350
|
parameters: "Optional[StatementParameterType]" = None,
|
|
359
|
-
/,
|
|
360
351
|
*filters: "StatementFilter",
|
|
361
352
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
362
353
|
**kwargs: Any,
|
|
363
354
|
) -> int:
|
|
364
|
-
"""
|
|
355
|
+
"""Insert, update, or delete data from the database.
|
|
365
356
|
|
|
366
357
|
Returns:
|
|
367
|
-
|
|
358
|
+
Row count affected by the operation.
|
|
368
359
|
"""
|
|
369
360
|
connection = self._connection(connection)
|
|
370
361
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
@@ -377,7 +368,6 @@ class PsycopgSyncDriver(
|
|
|
377
368
|
self,
|
|
378
369
|
sql: str,
|
|
379
370
|
parameters: "Optional[StatementParameterType]" = None,
|
|
380
|
-
/,
|
|
381
371
|
*filters: "StatementFilter",
|
|
382
372
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
383
373
|
schema_type: None = None,
|
|
@@ -388,7 +378,6 @@ class PsycopgSyncDriver(
|
|
|
388
378
|
self,
|
|
389
379
|
sql: str,
|
|
390
380
|
parameters: "Optional[StatementParameterType]" = None,
|
|
391
|
-
/,
|
|
392
381
|
*filters: "StatementFilter",
|
|
393
382
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
394
383
|
schema_type: "type[ModelDTOT]",
|
|
@@ -398,33 +387,28 @@ class PsycopgSyncDriver(
|
|
|
398
387
|
self,
|
|
399
388
|
sql: str,
|
|
400
389
|
parameters: "Optional[StatementParameterType]" = None,
|
|
401
|
-
/,
|
|
402
390
|
*filters: "StatementFilter",
|
|
403
391
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
404
392
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
405
393
|
**kwargs: Any,
|
|
406
|
-
) -> "
|
|
407
|
-
"""Insert, update, or delete data
|
|
394
|
+
) -> "Union[ModelDTOT, dict[str, Any]]":
|
|
395
|
+
"""Insert, update, or delete data with RETURNING clause.
|
|
408
396
|
|
|
409
397
|
Returns:
|
|
410
|
-
The
|
|
398
|
+
The returned row data, as either a model instance or dictionary.
|
|
411
399
|
"""
|
|
412
400
|
connection = self._connection(connection)
|
|
413
401
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
414
402
|
with self._with_cursor(connection) as cursor:
|
|
415
403
|
cursor.execute(sql, parameters)
|
|
416
404
|
result = cursor.fetchone()
|
|
417
|
-
|
|
418
|
-
if result is None:
|
|
419
|
-
return None
|
|
420
|
-
|
|
405
|
+
result = self.check_not_found(result)
|
|
421
406
|
return self.to_schema(cast("dict[str, Any]", result), schema_type=schema_type)
|
|
422
407
|
|
|
423
408
|
def execute_script(
|
|
424
409
|
self,
|
|
425
410
|
sql: str,
|
|
426
411
|
parameters: "Optional[StatementParameterType]" = None,
|
|
427
|
-
/,
|
|
428
412
|
connection: "Optional[PsycopgSyncConnection]" = None,
|
|
429
413
|
**kwargs: Any,
|
|
430
414
|
) -> str:
|
|
@@ -468,7 +452,6 @@ class PsycopgAsyncDriver(
|
|
|
468
452
|
self,
|
|
469
453
|
sql: str,
|
|
470
454
|
parameters: "Optional[StatementParameterType]" = None,
|
|
471
|
-
/,
|
|
472
455
|
*filters: "StatementFilter",
|
|
473
456
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
474
457
|
schema_type: None = None,
|
|
@@ -479,7 +462,6 @@ class PsycopgAsyncDriver(
|
|
|
479
462
|
self,
|
|
480
463
|
sql: str,
|
|
481
464
|
parameters: "Optional[StatementParameterType]" = None,
|
|
482
|
-
/,
|
|
483
465
|
*filters: "StatementFilter",
|
|
484
466
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
485
467
|
schema_type: "type[ModelDTOT]",
|
|
@@ -489,7 +471,6 @@ class PsycopgAsyncDriver(
|
|
|
489
471
|
self,
|
|
490
472
|
sql: str,
|
|
491
473
|
parameters: "Optional[StatementParameterType]" = None,
|
|
492
|
-
/,
|
|
493
474
|
*filters: "StatementFilter",
|
|
494
475
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
495
476
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
@@ -507,6 +488,7 @@ class PsycopgAsyncDriver(
|
|
|
507
488
|
results = await cursor.fetchall()
|
|
508
489
|
if not results:
|
|
509
490
|
return []
|
|
491
|
+
|
|
510
492
|
return self.to_schema(cast("Sequence[dict[str, Any]]", results), schema_type=schema_type)
|
|
511
493
|
|
|
512
494
|
@overload
|
|
@@ -514,7 +496,6 @@ class PsycopgAsyncDriver(
|
|
|
514
496
|
self,
|
|
515
497
|
sql: str,
|
|
516
498
|
parameters: "Optional[StatementParameterType]" = None,
|
|
517
|
-
/,
|
|
518
499
|
*filters: "StatementFilter",
|
|
519
500
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
520
501
|
schema_type: None = None,
|
|
@@ -525,7 +506,6 @@ class PsycopgAsyncDriver(
|
|
|
525
506
|
self,
|
|
526
507
|
sql: str,
|
|
527
508
|
parameters: "Optional[StatementParameterType]" = None,
|
|
528
|
-
/,
|
|
529
509
|
*filters: "StatementFilter",
|
|
530
510
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
531
511
|
schema_type: "type[ModelDTOT]",
|
|
@@ -535,7 +515,6 @@ class PsycopgAsyncDriver(
|
|
|
535
515
|
self,
|
|
536
516
|
sql: str,
|
|
537
517
|
parameters: "Optional[StatementParameterType]" = None,
|
|
538
|
-
/,
|
|
539
518
|
*filters: "StatementFilter",
|
|
540
519
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
541
520
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
@@ -550,17 +529,15 @@ class PsycopgAsyncDriver(
|
|
|
550
529
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
551
530
|
async with self._with_cursor(connection) as cursor:
|
|
552
531
|
await cursor.execute(sql, parameters)
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
return self.to_schema(cast("dict[str, Any]", row), schema_type=schema_type)
|
|
532
|
+
result = await cursor.fetchone()
|
|
533
|
+
result = self.check_not_found(result)
|
|
534
|
+
return self.to_schema(cast("dict[str, Any]", result), schema_type=schema_type)
|
|
557
535
|
|
|
558
536
|
@overload
|
|
559
537
|
async def select_one_or_none(
|
|
560
538
|
self,
|
|
561
539
|
sql: str,
|
|
562
540
|
parameters: "Optional[StatementParameterType]" = None,
|
|
563
|
-
/,
|
|
564
541
|
*filters: "StatementFilter",
|
|
565
542
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
566
543
|
schema_type: None = None,
|
|
@@ -571,7 +548,6 @@ class PsycopgAsyncDriver(
|
|
|
571
548
|
self,
|
|
572
549
|
sql: str,
|
|
573
550
|
parameters: "Optional[StatementParameterType]" = None,
|
|
574
|
-
/,
|
|
575
551
|
*filters: "StatementFilter",
|
|
576
552
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
577
553
|
schema_type: "type[ModelDTOT]",
|
|
@@ -581,7 +557,6 @@ class PsycopgAsyncDriver(
|
|
|
581
557
|
self,
|
|
582
558
|
sql: str,
|
|
583
559
|
parameters: "Optional[StatementParameterType]" = None,
|
|
584
|
-
/,
|
|
585
560
|
*filters: "StatementFilter",
|
|
586
561
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
587
562
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
@@ -590,25 +565,22 @@ class PsycopgAsyncDriver(
|
|
|
590
565
|
"""Fetch one row from the database.
|
|
591
566
|
|
|
592
567
|
Returns:
|
|
593
|
-
The first row of the query results.
|
|
568
|
+
The first row of the query results, or None if no results.
|
|
594
569
|
"""
|
|
595
570
|
connection = self._connection(connection)
|
|
596
571
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
597
572
|
async with self._with_cursor(connection) as cursor:
|
|
598
573
|
await cursor.execute(sql, parameters)
|
|
599
|
-
|
|
600
|
-
if
|
|
574
|
+
result = await cursor.fetchone()
|
|
575
|
+
if result is None:
|
|
601
576
|
return None
|
|
602
|
-
|
|
603
|
-
# Use self.to_schema from ResultConverter mixin
|
|
604
|
-
return self.to_schema(cast("dict[str, Any]", row), schema_type=schema_type)
|
|
577
|
+
return self.to_schema(cast("dict[str, Any]", result), schema_type=schema_type)
|
|
605
578
|
|
|
606
579
|
@overload
|
|
607
580
|
async def select_value(
|
|
608
581
|
self,
|
|
609
582
|
sql: str,
|
|
610
583
|
parameters: "Optional[StatementParameterType]" = None,
|
|
611
|
-
/,
|
|
612
584
|
*filters: "StatementFilter",
|
|
613
585
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
614
586
|
schema_type: None = None,
|
|
@@ -619,7 +591,6 @@ class PsycopgAsyncDriver(
|
|
|
619
591
|
self,
|
|
620
592
|
sql: str,
|
|
621
593
|
parameters: "Optional[StatementParameterType]" = None,
|
|
622
|
-
/,
|
|
623
594
|
*filters: "StatementFilter",
|
|
624
595
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
625
596
|
schema_type: "type[T]",
|
|
@@ -629,7 +600,6 @@ class PsycopgAsyncDriver(
|
|
|
629
600
|
self,
|
|
630
601
|
sql: str,
|
|
631
602
|
parameters: "Optional[StatementParameterType]" = None,
|
|
632
|
-
/,
|
|
633
603
|
*filters: "StatementFilter",
|
|
634
604
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
635
605
|
schema_type: "Optional[type[T]]" = None,
|
|
@@ -638,26 +608,25 @@ class PsycopgAsyncDriver(
|
|
|
638
608
|
"""Fetch a single value from the database.
|
|
639
609
|
|
|
640
610
|
Returns:
|
|
641
|
-
The first value from the first row of results
|
|
611
|
+
The first value from the first row of results.
|
|
642
612
|
"""
|
|
643
613
|
connection = self._connection(connection)
|
|
644
614
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
645
615
|
async with self._with_cursor(connection) as cursor:
|
|
646
616
|
await cursor.execute(sql, parameters)
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
if schema_type is
|
|
652
|
-
return
|
|
653
|
-
return
|
|
617
|
+
result = await cursor.fetchone()
|
|
618
|
+
result = self.check_not_found(result)
|
|
619
|
+
|
|
620
|
+
value = next(iter(result.values())) # Get the first value from the row
|
|
621
|
+
if schema_type is None:
|
|
622
|
+
return value
|
|
623
|
+
return schema_type(value) # type: ignore[call-arg]
|
|
654
624
|
|
|
655
625
|
@overload
|
|
656
626
|
async def select_value_or_none(
|
|
657
627
|
self,
|
|
658
628
|
sql: str,
|
|
659
629
|
parameters: "Optional[StatementParameterType]" = None,
|
|
660
|
-
/,
|
|
661
630
|
*filters: "StatementFilter",
|
|
662
631
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
663
632
|
schema_type: None = None,
|
|
@@ -668,7 +637,6 @@ class PsycopgAsyncDriver(
|
|
|
668
637
|
self,
|
|
669
638
|
sql: str,
|
|
670
639
|
parameters: "Optional[StatementParameterType]" = None,
|
|
671
|
-
/,
|
|
672
640
|
*filters: "StatementFilter",
|
|
673
641
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
674
642
|
schema_type: "type[T]",
|
|
@@ -678,7 +646,6 @@ class PsycopgAsyncDriver(
|
|
|
678
646
|
self,
|
|
679
647
|
sql: str,
|
|
680
648
|
parameters: "Optional[StatementParameterType]" = None,
|
|
681
|
-
/,
|
|
682
649
|
*filters: "StatementFilter",
|
|
683
650
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
684
651
|
schema_type: "Optional[type[T]]" = None,
|
|
@@ -693,29 +660,27 @@ class PsycopgAsyncDriver(
|
|
|
693
660
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
694
661
|
async with self._with_cursor(connection) as cursor:
|
|
695
662
|
await cursor.execute(sql, parameters)
|
|
696
|
-
|
|
697
|
-
if
|
|
698
|
-
return None
|
|
699
|
-
val = next(iter(row.values())) if row else None
|
|
700
|
-
if val is None:
|
|
663
|
+
result = await cursor.fetchone()
|
|
664
|
+
if result is None:
|
|
701
665
|
return None
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
666
|
+
|
|
667
|
+
value = next(iter(result.values())) # Get the first value from the row
|
|
668
|
+
if schema_type is None:
|
|
669
|
+
return value
|
|
670
|
+
return schema_type(value) # type: ignore[call-arg]
|
|
705
671
|
|
|
706
672
|
async def insert_update_delete(
|
|
707
673
|
self,
|
|
708
674
|
sql: str,
|
|
709
675
|
parameters: "Optional[StatementParameterType]" = None,
|
|
710
|
-
/,
|
|
711
676
|
*filters: "StatementFilter",
|
|
712
677
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
713
678
|
**kwargs: Any,
|
|
714
679
|
) -> int:
|
|
715
|
-
"""
|
|
680
|
+
"""Insert, update, or delete data from the database.
|
|
716
681
|
|
|
717
682
|
Returns:
|
|
718
|
-
|
|
683
|
+
Row count affected by the operation.
|
|
719
684
|
"""
|
|
720
685
|
connection = self._connection(connection)
|
|
721
686
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
@@ -728,7 +693,6 @@ class PsycopgAsyncDriver(
|
|
|
728
693
|
self,
|
|
729
694
|
sql: str,
|
|
730
695
|
parameters: "Optional[StatementParameterType]" = None,
|
|
731
|
-
/,
|
|
732
696
|
*filters: "StatementFilter",
|
|
733
697
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
734
698
|
schema_type: None = None,
|
|
@@ -739,7 +703,6 @@ class PsycopgAsyncDriver(
|
|
|
739
703
|
self,
|
|
740
704
|
sql: str,
|
|
741
705
|
parameters: "Optional[StatementParameterType]" = None,
|
|
742
|
-
/,
|
|
743
706
|
*filters: "StatementFilter",
|
|
744
707
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
745
708
|
schema_type: "type[ModelDTOT]",
|
|
@@ -749,32 +712,28 @@ class PsycopgAsyncDriver(
|
|
|
749
712
|
self,
|
|
750
713
|
sql: str,
|
|
751
714
|
parameters: "Optional[StatementParameterType]" = None,
|
|
752
|
-
/,
|
|
753
715
|
*filters: "StatementFilter",
|
|
754
716
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
755
717
|
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
756
718
|
**kwargs: Any,
|
|
757
|
-
) -> "
|
|
758
|
-
"""Insert, update, or delete data
|
|
719
|
+
) -> "Union[ModelDTOT, dict[str, Any]]":
|
|
720
|
+
"""Insert, update, or delete data with RETURNING clause.
|
|
759
721
|
|
|
760
722
|
Returns:
|
|
761
|
-
The
|
|
723
|
+
The returned row data, as either a model instance or dictionary.
|
|
762
724
|
"""
|
|
763
725
|
connection = self._connection(connection)
|
|
764
726
|
sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
|
|
765
727
|
async with self._with_cursor(connection) as cursor:
|
|
766
728
|
await cursor.execute(sql, parameters)
|
|
767
729
|
result = await cursor.fetchone()
|
|
768
|
-
|
|
769
|
-
return None
|
|
770
|
-
|
|
730
|
+
result = self.check_not_found(result)
|
|
771
731
|
return self.to_schema(cast("dict[str, Any]", result), schema_type=schema_type)
|
|
772
732
|
|
|
773
733
|
async def execute_script(
|
|
774
734
|
self,
|
|
775
735
|
sql: str,
|
|
776
736
|
parameters: "Optional[StatementParameterType]" = None,
|
|
777
|
-
/,
|
|
778
737
|
connection: "Optional[PsycopgAsyncConnection]" = None,
|
|
779
738
|
**kwargs: Any,
|
|
780
739
|
) -> str:
|