sqlspec 0.10.1__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.
- sqlspec/adapters/adbc/config.py +1 -1
- sqlspec/adapters/adbc/driver.py +336 -165
- sqlspec/adapters/aiosqlite/driver.py +211 -126
- sqlspec/adapters/asyncmy/driver.py +164 -68
- sqlspec/adapters/asyncpg/config.py +3 -1
- sqlspec/adapters/asyncpg/driver.py +190 -231
- sqlspec/adapters/bigquery/driver.py +178 -169
- sqlspec/adapters/duckdb/driver.py +175 -84
- sqlspec/adapters/oracledb/driver.py +224 -90
- sqlspec/adapters/psqlpy/driver.py +267 -187
- sqlspec/adapters/psycopg/driver.py +138 -184
- sqlspec/adapters/sqlite/driver.py +153 -121
- sqlspec/base.py +57 -45
- sqlspec/extensions/litestar/__init__.py +3 -12
- sqlspec/extensions/litestar/config.py +22 -7
- sqlspec/extensions/litestar/handlers.py +142 -85
- sqlspec/extensions/litestar/plugin.py +9 -8
- sqlspec/extensions/litestar/providers.py +521 -0
- sqlspec/filters.py +214 -11
- sqlspec/mixins.py +152 -2
- sqlspec/statement.py +276 -271
- sqlspec/typing.py +18 -1
- sqlspec/utils/__init__.py +2 -2
- sqlspec/utils/singleton.py +35 -0
- sqlspec/utils/sync_tools.py +90 -151
- sqlspec/utils/text.py +68 -5
- {sqlspec-0.10.1.dist-info → sqlspec-0.11.0.dist-info}/METADATA +5 -1
- {sqlspec-0.10.1.dist-info → sqlspec-0.11.0.dist-info}/RECORD +31 -29
- {sqlspec-0.10.1.dist-info → sqlspec-0.11.0.dist-info}/WHEEL +0 -0
- {sqlspec-0.10.1.dist-info → sqlspec-0.11.0.dist-info}/licenses/LICENSE +0 -0
- {sqlspec-0.10.1.dist-info → sqlspec-0.11.0.dist-info}/licenses/NOTICE +0 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
"""
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|
-
"""
|
|
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
|
-
|
|
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
|
-
|
|
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
|