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.

@@ -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
- statement = SQLStatement(sql, parameters, kwargs=kwargs, dialect=self.dialect)
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 filters:
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
- row = cursor.fetchone()
205
- row = self.check_not_found(row)
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
- row = cursor.fetchone()
251
- if row is None:
249
+ result = cursor.fetchone()
250
+ if result is None:
252
251
  return None
253
- return self.to_schema(cast("dict[str, Any]", row), schema_type=schema_type)
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, or None if no 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
- row = cursor.fetchone()
297
- row = self.check_not_found(row)
298
- val = next(iter(row.values())) if row else None
299
- val = self.check_not_found(val)
300
- if schema_type is not None:
301
- return schema_type(val) # type: ignore[call-arg]
302
- return val
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
- row = cursor.fetchone()
346
- if row is None:
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
- if schema_type is not None:
352
- return schema_type(val) # type: ignore[call-arg]
353
- return val
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
- """Execute an INSERT, UPDATE, or DELETE query and return the number of affected rows.
355
+ """Insert, update, or delete data from the database.
365
356
 
366
357
  Returns:
367
- The number of rows affected by the operation.
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
- ) -> "Optional[Union[dict[str, Any], ModelDTOT]]":
407
- """Insert, update, or delete data from the database and return result.
394
+ ) -> "Union[ModelDTOT, dict[str, Any]]":
395
+ """Insert, update, or delete data with RETURNING clause.
408
396
 
409
397
  Returns:
410
- The first row of results.
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
- row = await cursor.fetchone()
554
- row = self.check_not_found(row)
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
- row = await cursor.fetchone()
600
- if row is None:
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, or None if no 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
- row = await cursor.fetchone()
648
- row = self.check_not_found(row)
649
- val = next(iter(row.values())) if row else None
650
- val = self.check_not_found(val)
651
- if schema_type is not None:
652
- return schema_type(val) # type: ignore[call-arg]
653
- return val
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
- row = await cursor.fetchone()
697
- if row is None:
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
- if schema_type is not None:
703
- return schema_type(val) # type: ignore[call-arg]
704
- return val
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
- """Execute an INSERT, UPDATE, or DELETE query and return the number of affected rows.
680
+ """Insert, update, or delete data from the database.
716
681
 
717
682
  Returns:
718
- The number of rows affected by the operation.
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
- ) -> "Optional[Union[dict[str, Any], ModelDTOT]]":
758
- """Insert, update, or delete data from the database and return result.
719
+ ) -> "Union[ModelDTOT, dict[str, Any]]":
720
+ """Insert, update, or delete data with RETURNING clause.
759
721
 
760
722
  Returns:
761
- The first row of results.
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
- if result is None:
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: