sqlspec 0.10.0__py3-none-any.whl → 0.11.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.

@@ -1,15 +1,23 @@
1
+ import logging
1
2
  from contextlib import asynccontextmanager, contextmanager
2
3
  from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
3
4
 
4
5
  from oracledb import AsyncConnection, AsyncCursor, Connection, Cursor
5
6
 
6
7
  from sqlspec.base import AsyncDriverAdapterProtocol, SyncDriverAdapterProtocol
7
- from sqlspec.mixins import AsyncArrowBulkOperationsMixin, SQLTranslatorMixin, SyncArrowBulkOperationsMixin
8
+ from sqlspec.mixins import (
9
+ AsyncArrowBulkOperationsMixin,
10
+ ResultConverter,
11
+ SQLTranslatorMixin,
12
+ SyncArrowBulkOperationsMixin,
13
+ )
14
+ from sqlspec.statement import SQLStatement
8
15
  from sqlspec.typing import ArrowTable, StatementParameterType, T
9
16
 
10
17
  if TYPE_CHECKING:
11
18
  from collections.abc import AsyncGenerator, Generator, Sequence
12
19
 
20
+ from sqlspec.filters import StatementFilter
13
21
  from sqlspec.typing import ModelDTOT
14
22
 
15
23
  __all__ = ("OracleAsyncConnection", "OracleAsyncDriver", "OracleSyncConnection", "OracleSyncDriver")
@@ -17,16 +25,64 @@ __all__ = ("OracleAsyncConnection", "OracleAsyncDriver", "OracleSyncConnection",
17
25
  OracleSyncConnection = Connection
18
26
  OracleAsyncConnection = AsyncConnection
19
27
 
28
+ logger = logging.getLogger("sqlspec")
29
+
30
+
31
+ class OracleDriverBase:
32
+ """Base class for Oracle drivers with common functionality."""
33
+
34
+ dialect: str = "oracle"
35
+
36
+ def _process_sql_params(
37
+ self,
38
+ sql: str,
39
+ parameters: "Optional[StatementParameterType]" = None,
40
+ /,
41
+ *filters: "StatementFilter",
42
+ **kwargs: Any,
43
+ ) -> "tuple[str, Optional[Union[tuple[Any, ...], dict[str, Any]]]]":
44
+ """Process SQL and parameters using SQLStatement with dialect support.
45
+
46
+ Args:
47
+ sql: The SQL statement to process.
48
+ parameters: The parameters to bind to the statement.
49
+ *filters: Statement filters to apply.
50
+ **kwargs: Additional keyword arguments.
51
+
52
+ Returns:
53
+ A tuple of (sql, parameters) ready for execution.
54
+ """
55
+ # Special case: Oracle treats empty dicts as None
56
+ if isinstance(parameters, dict) and not parameters and not kwargs:
57
+ return sql, None
58
+
59
+ # Create a SQLStatement with appropriate dialect
60
+ statement = SQLStatement(sql, parameters, kwargs=kwargs, dialect=self.dialect)
61
+
62
+ # Apply any filters
63
+ for filter_obj in filters:
64
+ statement = statement.apply_filter(filter_obj)
65
+
66
+ processed_sql, processed_params, _ = statement.process()
67
+ if processed_params is None:
68
+ return processed_sql, None
69
+ if isinstance(processed_params, dict):
70
+ return processed_sql, processed_params
71
+ if isinstance(processed_params, (list, tuple)):
72
+ return processed_sql, tuple(processed_params)
73
+ return processed_sql, (processed_params,) # type: ignore[unreachable]
74
+
20
75
 
21
76
  class OracleSyncDriver(
77
+ OracleDriverBase,
22
78
  SyncArrowBulkOperationsMixin["OracleSyncConnection"],
23
79
  SQLTranslatorMixin["OracleSyncConnection"],
24
80
  SyncDriverAdapterProtocol["OracleSyncConnection"],
81
+ ResultConverter,
25
82
  ):
26
83
  """Oracle Sync Driver Adapter."""
27
84
 
28
85
  connection: "OracleSyncConnection"
29
- dialect: str = "oracle"
30
86
 
31
87
  def __init__(self, connection: "OracleSyncConnection") -> None:
32
88
  self.connection = connection
@@ -47,7 +103,7 @@ class OracleSyncDriver(
47
103
  sql: str,
48
104
  parameters: "Optional[StatementParameterType]" = None,
49
105
  /,
50
- *,
106
+ *filters: "StatementFilter",
51
107
  connection: "Optional[OracleSyncConnection]" = None,
52
108
  schema_type: None = None,
53
109
  **kwargs: Any,
@@ -58,7 +114,7 @@ class OracleSyncDriver(
58
114
  sql: str,
59
115
  parameters: "Optional[StatementParameterType]" = None,
60
116
  /,
61
- *,
117
+ *filters: "StatementFilter",
62
118
  connection: "Optional[OracleSyncConnection]" = None,
63
119
  schema_type: "type[ModelDTOT]",
64
120
  **kwargs: Any,
@@ -68,7 +124,7 @@ class OracleSyncDriver(
68
124
  sql: str,
69
125
  parameters: "Optional[StatementParameterType]" = None,
70
126
  /,
71
- *,
127
+ *filters: "StatementFilter",
72
128
  connection: "Optional[OracleSyncConnection]" = None,
73
129
  schema_type: "Optional[type[ModelDTOT]]" = None,
74
130
  **kwargs: Any,
@@ -78,6 +134,7 @@ class OracleSyncDriver(
78
134
  Args:
79
135
  sql: The SQL query string.
80
136
  parameters: The parameters for the query (dict, tuple, list, or None).
137
+ *filters: Statement filters to apply.
81
138
  connection: Optional connection override.
82
139
  schema_type: Optional schema class for the result.
83
140
  **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
@@ -86,7 +143,7 @@ class OracleSyncDriver(
86
143
  List of row data as either model instances or dictionaries.
87
144
  """
88
145
  connection = self._connection(connection)
89
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
146
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
90
147
  with self._with_cursor(connection) as cursor:
91
148
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
92
149
  results = cursor.fetchall() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
@@ -95,10 +152,7 @@ class OracleSyncDriver(
95
152
  # Get column names
96
153
  column_names = [col[0] for col in cursor.description or []] # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType]
97
154
 
98
- if schema_type:
99
- return [cast("ModelDTOT", schema_type(**dict(zip(column_names, row)))) for row in results] # pyright: ignore
100
-
101
- return [dict(zip(column_names, row)) for row in results] # pyright: ignore
155
+ return self.to_schema([dict(zip(column_names, row)) for row in results], schema_type=schema_type)
102
156
 
103
157
  @overload
104
158
  def select_one(
@@ -106,7 +160,7 @@ class OracleSyncDriver(
106
160
  sql: str,
107
161
  parameters: "Optional[StatementParameterType]" = None,
108
162
  /,
109
- *,
163
+ *filters: "StatementFilter",
110
164
  connection: "Optional[OracleSyncConnection]" = None,
111
165
  schema_type: None = None,
112
166
  **kwargs: Any,
@@ -117,7 +171,7 @@ class OracleSyncDriver(
117
171
  sql: str,
118
172
  parameters: "Optional[StatementParameterType]" = None,
119
173
  /,
120
- *,
174
+ *filters: "StatementFilter",
121
175
  connection: "Optional[OracleSyncConnection]" = None,
122
176
  schema_type: "type[ModelDTOT]",
123
177
  **kwargs: Any,
@@ -127,7 +181,7 @@ class OracleSyncDriver(
127
181
  sql: str,
128
182
  parameters: "Optional[StatementParameterType]" = None,
129
183
  /,
130
- *,
184
+ *filters: "StatementFilter",
131
185
  connection: "Optional[OracleSyncConnection]" = None,
132
186
  schema_type: "Optional[type[ModelDTOT]]" = None,
133
187
  **kwargs: Any,
@@ -137,6 +191,7 @@ class OracleSyncDriver(
137
191
  Args:
138
192
  sql: The SQL query string.
139
193
  parameters: The parameters for the query (dict, tuple, list, or None).
194
+ *filters: Statement filters to apply.
140
195
  connection: Optional connection override.
141
196
  schema_type: Optional schema class for the result.
142
197
  **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
@@ -145,7 +200,7 @@ class OracleSyncDriver(
145
200
  The first row of the query results.
146
201
  """
147
202
  connection = self._connection(connection)
148
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
203
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
149
204
 
150
205
  with self._with_cursor(connection) as cursor:
151
206
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -155,10 +210,7 @@ class OracleSyncDriver(
155
210
  # Get column names
156
211
  column_names = [col[0] for col in cursor.description or []] # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType]
157
212
 
158
- if schema_type is not None:
159
- return cast("ModelDTOT", schema_type(**dict(zip(column_names, result)))) # pyright: ignore[reportUnknownArgumentType]
160
- # Always return dictionaries
161
- return dict(zip(column_names, result)) # pyright: ignore[reportUnknownArgumentType,reportUnknownVariableType]
213
+ return self.to_schema(dict(zip(column_names, result)), schema_type=schema_type)
162
214
 
163
215
  @overload
164
216
  def select_one_or_none(
@@ -166,7 +218,7 @@ class OracleSyncDriver(
166
218
  sql: str,
167
219
  parameters: "Optional[StatementParameterType]" = None,
168
220
  /,
169
- *,
221
+ *filters: "StatementFilter",
170
222
  connection: "Optional[OracleSyncConnection]" = None,
171
223
  schema_type: None = None,
172
224
  **kwargs: Any,
@@ -177,7 +229,7 @@ class OracleSyncDriver(
177
229
  sql: str,
178
230
  parameters: "Optional[StatementParameterType]" = None,
179
231
  /,
180
- *,
232
+ *filters: "StatementFilter",
181
233
  connection: "Optional[OracleSyncConnection]" = None,
182
234
  schema_type: "type[ModelDTOT]",
183
235
  **kwargs: Any,
@@ -187,33 +239,37 @@ class OracleSyncDriver(
187
239
  sql: str,
188
240
  parameters: "Optional[StatementParameterType]" = None,
189
241
  /,
190
- *,
242
+ *filters: "StatementFilter",
191
243
  connection: "Optional[OracleSyncConnection]" = None,
192
244
  schema_type: "Optional[type[ModelDTOT]]" = None,
193
245
  **kwargs: Any,
194
246
  ) -> "Optional[Union[ModelDTOT, dict[str, Any]]]":
195
- """Fetch one row from the database.
247
+ """Fetch one row from the database or return None if no rows found.
248
+
249
+ Args:
250
+ sql: The SQL query string.
251
+ parameters: The parameters for the query (dict, tuple, list, or None).
252
+ *filters: Statement filters to apply.
253
+ connection: Optional connection override.
254
+ schema_type: Optional schema class for the result.
255
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
196
256
 
197
257
  Returns:
198
- The first row of the query results.
258
+ The first row of the query results, or None if no results found.
199
259
  """
200
260
  connection = self._connection(connection)
201
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
261
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
202
262
 
203
263
  with self._with_cursor(connection) as cursor:
204
264
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
205
265
  result = cursor.fetchone() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
206
-
207
266
  if result is None:
208
267
  return None
209
268
 
210
269
  # Get column names
211
270
  column_names = [col[0] for col in cursor.description or []] # pyright: ignore[reportUnknownMemberType,reportUnknownVariableType]
212
271
 
213
- if schema_type is not None:
214
- return cast("ModelDTOT", schema_type(**dict(zip(column_names, result)))) # pyright: ignore[reportUnknownArgumentType]
215
- # Always return dictionaries
216
- return dict(zip(column_names, result)) # pyright: ignore[reportUnknownArgumentType,reportUnknownVariableType]
272
+ return self.to_schema(dict(zip(column_names, result)), schema_type=schema_type)
217
273
 
218
274
  @overload
219
275
  def select_value(
@@ -221,7 +277,7 @@ class OracleSyncDriver(
221
277
  sql: str,
222
278
  parameters: "Optional[StatementParameterType]" = None,
223
279
  /,
224
- *,
280
+ *filters: "StatementFilter",
225
281
  connection: "Optional[OracleSyncConnection]" = None,
226
282
  schema_type: None = None,
227
283
  **kwargs: Any,
@@ -232,7 +288,7 @@ class OracleSyncDriver(
232
288
  sql: str,
233
289
  parameters: "Optional[StatementParameterType]" = None,
234
290
  /,
235
- *,
291
+ *filters: "StatementFilter",
236
292
  connection: "Optional[OracleSyncConnection]" = None,
237
293
  schema_type: "type[T]",
238
294
  **kwargs: Any,
@@ -242,18 +298,26 @@ class OracleSyncDriver(
242
298
  sql: str,
243
299
  parameters: "Optional[StatementParameterType]" = None,
244
300
  /,
245
- *,
301
+ *filters: "StatementFilter",
246
302
  connection: "Optional[OracleSyncConnection]" = None,
247
303
  schema_type: "Optional[type[T]]" = None,
248
304
  **kwargs: Any,
249
305
  ) -> "Union[T, Any]":
250
306
  """Fetch a single value from the database.
251
307
 
308
+ Args:
309
+ sql: The SQL query string.
310
+ parameters: The parameters for the query (dict, tuple, list, or None).
311
+ *filters: Statement filters to apply.
312
+ connection: Optional connection override.
313
+ schema_type: Optional type to convert the result to.
314
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
315
+
252
316
  Returns:
253
- The first value from the first row of results, or None if no results.
317
+ The first value of the first row of the query results.
254
318
  """
255
319
  connection = self._connection(connection)
256
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
320
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
257
321
 
258
322
  with self._with_cursor(connection) as cursor:
259
323
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -270,7 +334,7 @@ class OracleSyncDriver(
270
334
  sql: str,
271
335
  parameters: "Optional[StatementParameterType]" = None,
272
336
  /,
273
- *,
337
+ *filters: "StatementFilter",
274
338
  connection: "Optional[OracleSyncConnection]" = None,
275
339
  schema_type: None = None,
276
340
  **kwargs: Any,
@@ -281,7 +345,7 @@ class OracleSyncDriver(
281
345
  sql: str,
282
346
  parameters: "Optional[StatementParameterType]" = None,
283
347
  /,
284
- *,
348
+ *filters: "StatementFilter",
285
349
  connection: "Optional[OracleSyncConnection]" = None,
286
350
  schema_type: "type[T]",
287
351
  **kwargs: Any,
@@ -291,23 +355,30 @@ class OracleSyncDriver(
291
355
  sql: str,
292
356
  parameters: "Optional[StatementParameterType]" = None,
293
357
  /,
294
- *,
358
+ *filters: "StatementFilter",
295
359
  connection: "Optional[OracleSyncConnection]" = None,
296
360
  schema_type: "Optional[type[T]]" = None,
297
361
  **kwargs: Any,
298
362
  ) -> "Optional[Union[T, Any]]":
299
- """Fetch a single value from the database.
363
+ """Fetch a single value or None if not found.
364
+
365
+ Args:
366
+ sql: The SQL query string.
367
+ parameters: The parameters for the query (dict, tuple, list, or None).
368
+ *filters: Statement filters to apply.
369
+ connection: Optional connection override.
370
+ schema_type: Optional type to convert the result to.
371
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
300
372
 
301
373
  Returns:
302
- The first value from the first row of results, or None if no results.
374
+ The first value of the first row of the query results, or None if no results found.
303
375
  """
304
376
  connection = self._connection(connection)
305
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
377
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
306
378
 
307
379
  with self._with_cursor(connection) as cursor:
308
380
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
309
381
  result = cursor.fetchone() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
310
-
311
382
  if result is None:
312
383
  return None
313
384
 
@@ -320,21 +391,28 @@ class OracleSyncDriver(
320
391
  sql: str,
321
392
  parameters: "Optional[StatementParameterType]" = None,
322
393
  /,
323
- *,
394
+ *filters: "StatementFilter",
324
395
  connection: "Optional[OracleSyncConnection]" = None,
325
396
  **kwargs: Any,
326
397
  ) -> int:
327
- """Insert, update, or delete data from the database.
398
+ """Execute an insert, update, or delete statement.
399
+
400
+ Args:
401
+ sql: The SQL statement to execute.
402
+ parameters: The parameters for the statement (dict, tuple, list, or None).
403
+ *filters: Statement filters to apply.
404
+ connection: Optional connection override.
405
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
328
406
 
329
407
  Returns:
330
- Row count affected by the operation.
408
+ The number of rows affected by the statement.
331
409
  """
332
410
  connection = self._connection(connection)
333
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
411
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
334
412
 
335
413
  with self._with_cursor(connection) as cursor:
336
414
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
337
- return cursor.rowcount # pyright: ignore[reportUnknownMemberType]
415
+ return cursor.rowcount # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
338
416
 
339
417
  @overload
340
418
  def insert_update_delete_returning(
@@ -342,7 +420,7 @@ class OracleSyncDriver(
342
420
  sql: str,
343
421
  parameters: "Optional[StatementParameterType]" = None,
344
422
  /,
345
- *,
423
+ *filters: "StatementFilter",
346
424
  connection: "Optional[OracleSyncConnection]" = None,
347
425
  schema_type: None = None,
348
426
  **kwargs: Any,
@@ -353,7 +431,7 @@ class OracleSyncDriver(
353
431
  sql: str,
354
432
  parameters: "Optional[StatementParameterType]" = None,
355
433
  /,
356
- *,
434
+ *filters: "StatementFilter",
357
435
  connection: "Optional[OracleSyncConnection]" = None,
358
436
  schema_type: "type[ModelDTOT]",
359
437
  **kwargs: Any,
@@ -363,7 +441,7 @@ class OracleSyncDriver(
363
441
  sql: str,
364
442
  parameters: "Optional[StatementParameterType]" = None,
365
443
  /,
366
- *,
444
+ *filters: "StatementFilter",
367
445
  connection: "Optional[OracleSyncConnection]" = None,
368
446
  schema_type: "Optional[type[ModelDTOT]]" = None,
369
447
  **kwargs: Any,
@@ -374,7 +452,7 @@ class OracleSyncDriver(
374
452
  The first row of results.
375
453
  """
376
454
  connection = self._connection(connection)
377
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
455
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
378
456
 
379
457
  with self._with_cursor(connection) as cursor:
380
458
  cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -396,14 +474,20 @@ class OracleSyncDriver(
396
474
  sql: str,
397
475
  parameters: "Optional[StatementParameterType]" = None,
398
476
  /,
399
- *,
400
477
  connection: "Optional[OracleSyncConnection]" = None,
401
478
  **kwargs: Any,
402
479
  ) -> str:
403
- """Execute a script.
480
+ """Execute a SQL script.
481
+
482
+ Args:
483
+ sql: The SQL script to execute.
484
+ parameters: The parameters for the script (dict, tuple, list, or None).
485
+ *filters: Statement filters to apply.
486
+ connection: Optional connection override.
487
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
404
488
 
405
489
  Returns:
406
- Status message for the operation.
490
+ A success message.
407
491
  """
408
492
  connection = self._connection(connection)
409
493
  sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
@@ -432,16 +516,28 @@ class OracleSyncDriver(
432
516
  results = connection.fetch_df_all(sql, parameters)
433
517
  return cast("ArrowTable", ArrowTable.from_arrays(arrays=results.column_arrays(), names=results.column_names())) # pyright: ignore
434
518
 
519
+ def _connection(self, connection: "Optional[OracleSyncConnection]" = None) -> "OracleSyncConnection":
520
+ """Get the connection to use for the operation.
521
+
522
+ Args:
523
+ connection: Optional connection to use.
524
+
525
+ Returns:
526
+ The connection to use.
527
+ """
528
+ return connection or self.connection
529
+
435
530
 
436
531
  class OracleAsyncDriver(
532
+ OracleDriverBase,
437
533
  AsyncArrowBulkOperationsMixin["OracleAsyncConnection"],
438
534
  SQLTranslatorMixin["OracleAsyncConnection"],
439
535
  AsyncDriverAdapterProtocol["OracleAsyncConnection"],
536
+ ResultConverter,
440
537
  ):
441
538
  """Oracle Async Driver Adapter."""
442
539
 
443
540
  connection: "OracleAsyncConnection"
444
- dialect: str = "oracle"
445
541
 
446
542
  def __init__(self, connection: "OracleAsyncConnection") -> None:
447
543
  self.connection = connection
@@ -462,7 +558,7 @@ class OracleAsyncDriver(
462
558
  sql: str,
463
559
  parameters: "Optional[StatementParameterType]" = None,
464
560
  /,
465
- *,
561
+ *filters: "StatementFilter",
466
562
  connection: "Optional[OracleAsyncConnection]" = None,
467
563
  schema_type: None = None,
468
564
  **kwargs: Any,
@@ -473,7 +569,7 @@ class OracleAsyncDriver(
473
569
  sql: str,
474
570
  parameters: "Optional[StatementParameterType]" = None,
475
571
  /,
476
- *,
572
+ *filters: "StatementFilter",
477
573
  connection: "Optional[OracleAsyncConnection]" = None,
478
574
  schema_type: "type[ModelDTOT]",
479
575
  **kwargs: Any,
@@ -483,7 +579,7 @@ class OracleAsyncDriver(
483
579
  sql: str,
484
580
  parameters: "Optional[StatementParameterType]" = None,
485
581
  /,
486
- *,
582
+ *filters: "StatementFilter",
487
583
  connection: "Optional[OracleAsyncConnection]" = None,
488
584
  schema_type: "Optional[type[ModelDTOT]]" = None,
489
585
  **kwargs: Any,
@@ -494,7 +590,7 @@ class OracleAsyncDriver(
494
590
  List of row data as either model instances or dictionaries.
495
591
  """
496
592
  connection = self._connection(connection)
497
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
593
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
498
594
 
499
595
  async with self._with_cursor(connection) as cursor:
500
596
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -515,7 +611,7 @@ class OracleAsyncDriver(
515
611
  sql: str,
516
612
  parameters: "Optional[StatementParameterType]" = None,
517
613
  /,
518
- *,
614
+ *filters: "StatementFilter",
519
615
  connection: "Optional[OracleAsyncConnection]" = None,
520
616
  schema_type: None = None,
521
617
  **kwargs: Any,
@@ -526,7 +622,7 @@ class OracleAsyncDriver(
526
622
  sql: str,
527
623
  parameters: "Optional[StatementParameterType]" = None,
528
624
  /,
529
- *,
625
+ *filters: "StatementFilter",
530
626
  connection: "Optional[OracleAsyncConnection]" = None,
531
627
  schema_type: "type[ModelDTOT]",
532
628
  **kwargs: Any,
@@ -536,7 +632,7 @@ class OracleAsyncDriver(
536
632
  sql: str,
537
633
  parameters: "Optional[StatementParameterType]" = None,
538
634
  /,
539
- *,
635
+ *filters: "StatementFilter",
540
636
  connection: "Optional[OracleAsyncConnection]" = None,
541
637
  schema_type: "Optional[type[ModelDTOT]]" = None,
542
638
  **kwargs: Any,
@@ -547,7 +643,7 @@ class OracleAsyncDriver(
547
643
  The first row of the query results.
548
644
  """
549
645
  connection = self._connection(connection)
550
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
646
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
551
647
 
552
648
  async with self._with_cursor(connection) as cursor:
553
649
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -567,7 +663,7 @@ class OracleAsyncDriver(
567
663
  sql: str,
568
664
  parameters: "Optional[StatementParameterType]" = None,
569
665
  /,
570
- *,
666
+ *filters: "StatementFilter",
571
667
  connection: "Optional[OracleAsyncConnection]" = None,
572
668
  schema_type: None = None,
573
669
  **kwargs: Any,
@@ -578,7 +674,7 @@ class OracleAsyncDriver(
578
674
  sql: str,
579
675
  parameters: "Optional[StatementParameterType]" = None,
580
676
  /,
581
- *,
677
+ *filters: "StatementFilter",
582
678
  connection: "Optional[OracleAsyncConnection]" = None,
583
679
  schema_type: "type[ModelDTOT]",
584
680
  **kwargs: Any,
@@ -588,7 +684,7 @@ class OracleAsyncDriver(
588
684
  sql: str,
589
685
  parameters: "Optional[StatementParameterType]" = None,
590
686
  /,
591
- *,
687
+ *filters: "StatementFilter",
592
688
  connection: "Optional[OracleAsyncConnection]" = None,
593
689
  schema_type: "Optional[type[ModelDTOT]]" = None,
594
690
  **kwargs: Any,
@@ -599,7 +695,7 @@ class OracleAsyncDriver(
599
695
  The first row of the query results.
600
696
  """
601
697
  connection = self._connection(connection)
602
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
698
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
603
699
 
604
700
  async with self._with_cursor(connection) as cursor:
605
701
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -622,7 +718,7 @@ class OracleAsyncDriver(
622
718
  sql: str,
623
719
  parameters: "Optional[StatementParameterType]" = None,
624
720
  /,
625
- *,
721
+ *filters: "StatementFilter",
626
722
  connection: "Optional[OracleAsyncConnection]" = None,
627
723
  schema_type: None = None,
628
724
  **kwargs: Any,
@@ -633,7 +729,7 @@ class OracleAsyncDriver(
633
729
  sql: str,
634
730
  parameters: "Optional[StatementParameterType]" = None,
635
731
  /,
636
- *,
732
+ *filters: "StatementFilter",
637
733
  connection: "Optional[OracleAsyncConnection]" = None,
638
734
  schema_type: "type[T]",
639
735
  **kwargs: Any,
@@ -643,23 +739,31 @@ class OracleAsyncDriver(
643
739
  sql: str,
644
740
  parameters: "Optional[StatementParameterType]" = None,
645
741
  /,
646
- *,
742
+ *filters: "StatementFilter",
647
743
  connection: "Optional[OracleAsyncConnection]" = None,
648
744
  schema_type: "Optional[type[T]]" = None,
649
745
  **kwargs: Any,
650
746
  ) -> "Union[T, Any]":
651
747
  """Fetch a single value from the database.
652
748
 
749
+ Args:
750
+ sql: The SQL query string.
751
+ parameters: The parameters for the query (dict, tuple, list, or None).
752
+ *filters: Statement filters to apply.
753
+ connection: Optional connection override.
754
+ schema_type: Optional type to convert the result to.
755
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
756
+
653
757
  Returns:
654
- The first value from the first row of results, or None if no results.
758
+ The first value of the first row of the query results.
655
759
  """
656
760
  connection = self._connection(connection)
657
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
761
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
658
762
 
659
763
  async with self._with_cursor(connection) as cursor:
660
764
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
661
765
  result = await cursor.fetchone() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
662
- result = self.check_not_found(result) # pyright: ignore[reportUnknownArgumentType]
766
+ result = self.check_not_found(result)
663
767
 
664
768
  if schema_type is None:
665
769
  return result[0] # pyright: ignore[reportUnknownArgumentType]
@@ -671,7 +775,7 @@ class OracleAsyncDriver(
671
775
  sql: str,
672
776
  parameters: "Optional[StatementParameterType]" = None,
673
777
  /,
674
- *,
778
+ *filters: "StatementFilter",
675
779
  connection: "Optional[OracleAsyncConnection]" = None,
676
780
  schema_type: None = None,
677
781
  **kwargs: Any,
@@ -682,7 +786,7 @@ class OracleAsyncDriver(
682
786
  sql: str,
683
787
  parameters: "Optional[StatementParameterType]" = None,
684
788
  /,
685
- *,
789
+ *filters: "StatementFilter",
686
790
  connection: "Optional[OracleAsyncConnection]" = None,
687
791
  schema_type: "type[T]",
688
792
  **kwargs: Any,
@@ -692,23 +796,30 @@ class OracleAsyncDriver(
692
796
  sql: str,
693
797
  parameters: "Optional[StatementParameterType]" = None,
694
798
  /,
695
- *,
799
+ *filters: "StatementFilter",
696
800
  connection: "Optional[OracleAsyncConnection]" = None,
697
801
  schema_type: "Optional[type[T]]" = None,
698
802
  **kwargs: Any,
699
803
  ) -> "Optional[Union[T, Any]]":
700
- """Fetch a single value from the database.
804
+ """Fetch a single value or None if not found.
805
+
806
+ Args:
807
+ sql: The SQL query string.
808
+ parameters: The parameters for the query (dict, tuple, list, or None).
809
+ *filters: Statement filters to apply.
810
+ connection: Optional connection override.
811
+ schema_type: Optional type to convert the result to.
812
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
701
813
 
702
814
  Returns:
703
- The first value from the first row of results, or None if no results.
815
+ The first value of the first row of the query results, or None if no results found.
704
816
  """
705
817
  connection = self._connection(connection)
706
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
818
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
707
819
 
708
820
  async with self._with_cursor(connection) as cursor:
709
821
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
710
822
  result = await cursor.fetchone() # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
711
-
712
823
  if result is None:
713
824
  return None
714
825
 
@@ -721,17 +832,24 @@ class OracleAsyncDriver(
721
832
  sql: str,
722
833
  parameters: "Optional[StatementParameterType]" = None,
723
834
  /,
724
- *,
835
+ *filters: "StatementFilter",
725
836
  connection: "Optional[OracleAsyncConnection]" = None,
726
837
  **kwargs: Any,
727
838
  ) -> int:
728
- """Insert, update, or delete data from the database.
839
+ """Execute an insert, update, or delete statement.
840
+
841
+ Args:
842
+ sql: The SQL statement to execute.
843
+ parameters: The parameters for the statement (dict, tuple, list, or None).
844
+ *filters: Statement filters to apply.
845
+ connection: Optional connection override.
846
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
729
847
 
730
848
  Returns:
731
- Row count affected by the operation.
849
+ The number of rows affected by the statement.
732
850
  """
733
851
  connection = self._connection(connection)
734
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
852
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
735
853
 
736
854
  async with self._with_cursor(connection) as cursor:
737
855
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -743,7 +861,7 @@ class OracleAsyncDriver(
743
861
  sql: str,
744
862
  parameters: "Optional[StatementParameterType]" = None,
745
863
  /,
746
- *,
864
+ *filters: "StatementFilter",
747
865
  connection: "Optional[OracleAsyncConnection]" = None,
748
866
  schema_type: None = None,
749
867
  **kwargs: Any,
@@ -754,7 +872,7 @@ class OracleAsyncDriver(
754
872
  sql: str,
755
873
  parameters: "Optional[StatementParameterType]" = None,
756
874
  /,
757
- *,
875
+ *filters: "StatementFilter",
758
876
  connection: "Optional[OracleAsyncConnection]" = None,
759
877
  schema_type: "type[ModelDTOT]",
760
878
  **kwargs: Any,
@@ -764,7 +882,7 @@ class OracleAsyncDriver(
764
882
  sql: str,
765
883
  parameters: "Optional[StatementParameterType]" = None,
766
884
  /,
767
- *,
885
+ *filters: "StatementFilter",
768
886
  connection: "Optional[OracleAsyncConnection]" = None,
769
887
  schema_type: "Optional[type[ModelDTOT]]" = None,
770
888
  **kwargs: Any,
@@ -775,7 +893,7 @@ class OracleAsyncDriver(
775
893
  The first row of results.
776
894
  """
777
895
  connection = self._connection(connection)
778
- sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
896
+ sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
779
897
 
780
898
  async with self._with_cursor(connection) as cursor:
781
899
  await cursor.execute(sql, parameters) # pyright: ignore[reportUnknownMemberType]
@@ -797,14 +915,19 @@ class OracleAsyncDriver(
797
915
  sql: str,
798
916
  parameters: "Optional[StatementParameterType]" = None,
799
917
  /,
800
- *,
801
918
  connection: "Optional[OracleAsyncConnection]" = None,
802
919
  **kwargs: Any,
803
920
  ) -> str:
804
- """Execute a script.
921
+ """Execute a SQL script.
922
+
923
+ Args:
924
+ sql: The SQL script to execute.
925
+ parameters: The parameters for the script (dict, tuple, list, or None).
926
+ connection: Optional connection override.
927
+ **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
805
928
 
806
929
  Returns:
807
- Status message for the operation.
930
+ A success message.
808
931
  """
809
932
  connection = self._connection(connection)
810
933
  sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
@@ -838,3 +961,14 @@ class OracleAsyncDriver(
838
961
  sql, parameters = self._process_sql_params(sql, parameters, **kwargs)
839
962
  results = await connection.fetch_df_all(sql, parameters)
840
963
  return ArrowTable.from_arrays(arrays=results.column_arrays(), names=results.column_names()) # pyright: ignore
964
+
965
+ def _connection(self, connection: "Optional[OracleAsyncConnection]" = None) -> "OracleAsyncConnection":
966
+ """Get the connection to use for the operation.
967
+
968
+ Args:
969
+ connection: Optional connection to use.
970
+
971
+ Returns:
972
+ The connection to use.
973
+ """
974
+ return connection or self.connection