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.

@@ -5,14 +5,14 @@ from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
5
5
  from duckdb import DuckDBPyConnection
6
6
 
7
7
  from sqlspec.base import SyncDriverAdapterProtocol
8
+ from sqlspec.filters import StatementFilter
8
9
  from sqlspec.mixins import ResultConverter, SQLTranslatorMixin, SyncArrowBulkOperationsMixin
9
10
  from sqlspec.statement import SQLStatement
10
11
  from sqlspec.typing import ArrowTable, StatementParameterType
11
12
 
12
13
  if TYPE_CHECKING:
13
- from collections.abc import Generator, Sequence
14
+ from collections.abc import Generator, Mapping, Sequence
14
15
 
15
- from sqlspec.filters import StatementFilter
16
16
  from sqlspec.typing import ArrowTable, ModelDTOT, StatementParameterType, T
17
17
 
18
18
  __all__ = ("DuckDBConnection", "DuckDBDriver")
@@ -58,7 +58,6 @@ class DuckDBDriver(
58
58
  self,
59
59
  sql: str,
60
60
  parameters: "Optional[StatementParameterType]" = None,
61
- /,
62
61
  *filters: "StatementFilter",
63
62
  **kwargs: Any,
64
63
  ) -> "tuple[str, Optional[Union[tuple[Any, ...], list[Any], dict[str, Any]]]]":
@@ -77,10 +76,18 @@ class DuckDBDriver(
77
76
  Returns:
78
77
  Tuple of processed SQL and parameters.
79
78
  """
80
- statement = SQLStatement(sql, parameters, kwargs=kwargs, dialect=self.dialect)
81
-
82
- # Apply any filters
83
- for filter_obj in filters:
79
+ data_params_for_statement: Optional[Union[Mapping[str, Any], Sequence[Any]]] = None
80
+ combined_filters_list: list[StatementFilter] = list(filters)
81
+
82
+ if parameters is not None:
83
+ if isinstance(parameters, StatementFilter):
84
+ combined_filters_list.insert(0, parameters)
85
+ else:
86
+ data_params_for_statement = parameters
87
+ if data_params_for_statement is not None and not isinstance(data_params_for_statement, (list, tuple, dict)):
88
+ data_params_for_statement = (data_params_for_statement,)
89
+ statement = SQLStatement(sql, data_params_for_statement, kwargs=kwargs, dialect=self.dialect)
90
+ for filter_obj in combined_filters_list:
84
91
  statement = statement.apply_filter(filter_obj)
85
92
 
86
93
  processed_sql, processed_params, _ = statement.process()
@@ -98,7 +105,6 @@ class DuckDBDriver(
98
105
  self,
99
106
  sql: str,
100
107
  parameters: "Optional[StatementParameterType]" = None,
101
- /,
102
108
  *filters: "StatementFilter",
103
109
  connection: "Optional[DuckDBConnection]" = None,
104
110
  schema_type: None = None,
@@ -109,7 +115,6 @@ class DuckDBDriver(
109
115
  self,
110
116
  sql: str,
111
117
  parameters: "Optional[StatementParameterType]" = None,
112
- /,
113
118
  *filters: "StatementFilter",
114
119
  connection: "Optional[DuckDBConnection]" = None,
115
120
  schema_type: "type[ModelDTOT]",
@@ -119,7 +124,6 @@ class DuckDBDriver(
119
124
  self,
120
125
  sql: str,
121
126
  parameters: "Optional[StatementParameterType]" = None,
122
- /,
123
127
  *filters: "StatementFilter",
124
128
  connection: "Optional[DuckDBConnection]" = None,
125
129
  schema_type: "Optional[type[ModelDTOT]]" = None,
@@ -138,17 +142,13 @@ class DuckDBDriver(
138
142
  if not results:
139
143
  return []
140
144
  column_names = [column[0] for column in cursor.description or []]
141
-
142
- # Convert to dicts first
143
- dict_results = [dict(zip(column_names, row)) for row in results]
144
- return self.to_schema(dict_results, schema_type=schema_type)
145
+ return self.to_schema([dict(zip(column_names, row)) for row in results], schema_type=schema_type)
145
146
 
146
147
  @overload
147
148
  def select_one(
148
149
  self,
149
150
  sql: str,
150
151
  parameters: "Optional[StatementParameterType]" = None,
151
- /,
152
152
  *filters: "StatementFilter",
153
153
  connection: "Optional[DuckDBConnection]" = None,
154
154
  schema_type: None = None,
@@ -159,7 +159,6 @@ class DuckDBDriver(
159
159
  self,
160
160
  sql: str,
161
161
  parameters: "Optional[StatementParameterType]" = None,
162
- /,
163
162
  *filters: "StatementFilter",
164
163
  connection: "Optional[DuckDBConnection]" = None,
165
164
  schema_type: "type[ModelDTOT]",
@@ -169,7 +168,6 @@ class DuckDBDriver(
169
168
  self,
170
169
  sql: str,
171
170
  parameters: "Optional[StatementParameterType]" = None,
172
- /,
173
171
  *filters: "StatementFilter",
174
172
  connection: "Optional[DuckDBConnection]" = None,
175
173
  schema_type: "Optional[type[ModelDTOT]]" = None,
@@ -187,17 +185,13 @@ class DuckDBDriver(
187
185
  result = cursor.fetchone()
188
186
  result = self.check_not_found(result)
189
187
  column_names = [column[0] for column in cursor.description or []]
190
-
191
- # Convert to dict and use ResultConverter
192
- dict_result = dict(zip(column_names, result))
193
- return self.to_schema(dict_result, schema_type=schema_type)
188
+ return self.to_schema(dict(zip(column_names, result)), schema_type=schema_type)
194
189
 
195
190
  @overload
196
191
  def select_one_or_none(
197
192
  self,
198
193
  sql: str,
199
194
  parameters: "Optional[StatementParameterType]" = None,
200
- /,
201
195
  *filters: "StatementFilter",
202
196
  connection: "Optional[DuckDBConnection]" = None,
203
197
  schema_type: None = None,
@@ -208,7 +202,6 @@ class DuckDBDriver(
208
202
  self,
209
203
  sql: str,
210
204
  parameters: "Optional[StatementParameterType]" = None,
211
- /,
212
205
  *filters: "StatementFilter",
213
206
  connection: "Optional[DuckDBConnection]" = None,
214
207
  schema_type: "type[ModelDTOT]",
@@ -218,7 +211,6 @@ class DuckDBDriver(
218
211
  self,
219
212
  sql: str,
220
213
  parameters: "Optional[StatementParameterType]" = None,
221
- /,
222
214
  *filters: "StatementFilter",
223
215
  connection: "Optional[DuckDBConnection]" = None,
224
216
  schema_type: "Optional[type[ModelDTOT]]" = None,
@@ -237,17 +229,13 @@ class DuckDBDriver(
237
229
  if result is None:
238
230
  return None
239
231
  column_names = [column[0] for column in cursor.description or []]
240
-
241
- # Convert to dict and use ResultConverter
242
- dict_result = dict(zip(column_names, result))
243
- return self.to_schema(dict_result, schema_type=schema_type)
232
+ return self.to_schema(dict(zip(column_names, result)), schema_type=schema_type)
244
233
 
245
234
  @overload
246
235
  def select_value(
247
236
  self,
248
237
  sql: str,
249
238
  parameters: "Optional[StatementParameterType]" = None,
250
- /,
251
239
  *filters: "StatementFilter",
252
240
  connection: "Optional[DuckDBConnection]" = None,
253
241
  schema_type: None = None,
@@ -258,7 +246,6 @@ class DuckDBDriver(
258
246
  self,
259
247
  sql: str,
260
248
  parameters: "Optional[StatementParameterType]" = None,
261
- /,
262
249
  *filters: "StatementFilter",
263
250
  connection: "Optional[DuckDBConnection]" = None,
264
251
  schema_type: "type[T]",
@@ -268,7 +255,6 @@ class DuckDBDriver(
268
255
  self,
269
256
  sql: str,
270
257
  parameters: "Optional[StatementParameterType]" = None,
271
- /,
272
258
  *filters: "StatementFilter",
273
259
  connection: "Optional[DuckDBConnection]" = None,
274
260
  schema_type: "Optional[type[T]]" = None,
@@ -295,7 +281,6 @@ class DuckDBDriver(
295
281
  self,
296
282
  sql: str,
297
283
  parameters: "Optional[StatementParameterType]" = None,
298
- /,
299
284
  *filters: "StatementFilter",
300
285
  connection: "Optional[DuckDBConnection]" = None,
301
286
  schema_type: None = None,
@@ -306,7 +291,6 @@ class DuckDBDriver(
306
291
  self,
307
292
  sql: str,
308
293
  parameters: "Optional[StatementParameterType]" = None,
309
- /,
310
294
  *filters: "StatementFilter",
311
295
  connection: "Optional[DuckDBConnection]" = None,
312
296
  schema_type: "type[T]",
@@ -316,7 +300,6 @@ class DuckDBDriver(
316
300
  self,
317
301
  sql: str,
318
302
  parameters: "Optional[StatementParameterType]" = None,
319
- /,
320
303
  *filters: "StatementFilter",
321
304
  connection: "Optional[DuckDBConnection]" = None,
322
305
  schema_type: "Optional[type[T]]" = None,
@@ -337,7 +320,6 @@ class DuckDBDriver(
337
320
  self,
338
321
  sql: str,
339
322
  parameters: "Optional[StatementParameterType]" = None,
340
- /,
341
323
  *filters: "StatementFilter",
342
324
  connection: "Optional[DuckDBConnection]" = None,
343
325
  **kwargs: Any,
@@ -354,7 +336,6 @@ class DuckDBDriver(
354
336
  self,
355
337
  sql: str,
356
338
  parameters: "Optional[StatementParameterType]" = None,
357
- /,
358
339
  *filters: "StatementFilter",
359
340
  connection: "Optional[DuckDBConnection]" = None,
360
341
  schema_type: None = None,
@@ -365,7 +346,6 @@ class DuckDBDriver(
365
346
  self,
366
347
  sql: str,
367
348
  parameters: "Optional[StatementParameterType]" = None,
368
- /,
369
349
  *filters: "StatementFilter",
370
350
  connection: "Optional[DuckDBConnection]" = None,
371
351
  schema_type: "type[ModelDTOT]",
@@ -375,7 +355,6 @@ class DuckDBDriver(
375
355
  self,
376
356
  sql: str,
377
357
  parameters: "Optional[StatementParameterType]" = None,
378
- /,
379
358
  *filters: "StatementFilter",
380
359
  connection: "Optional[DuckDBConnection]" = None,
381
360
  schema_type: "Optional[type[ModelDTOT]]" = None,
@@ -389,16 +368,12 @@ class DuckDBDriver(
389
368
  result = cursor.fetchall()
390
369
  result = self.check_not_found(result)
391
370
  column_names = [col[0] for col in cursor.description or []]
392
-
393
- # Convert to dict and use ResultConverter
394
- dict_result = dict(zip(column_names, result[0]))
395
- return self.to_schema(dict_result, schema_type=schema_type)
371
+ return self.to_schema(dict(zip(column_names, result[0])), schema_type=schema_type)
396
372
 
397
373
  def execute_script(
398
374
  self,
399
375
  sql: str,
400
376
  parameters: "Optional[StatementParameterType]" = None,
401
- /,
402
377
  connection: "Optional[DuckDBConnection]" = None,
403
378
  **kwargs: Any,
404
379
  ) -> str:
@@ -415,8 +390,7 @@ class DuckDBDriver(
415
390
  self,
416
391
  sql: str,
417
392
  parameters: "Optional[StatementParameterType]" = None,
418
- /,
419
- *,
393
+ *filters: "StatementFilter",
420
394
  connection: "Optional[DuckDBConnection]" = None,
421
395
  **kwargs: Any,
422
396
  ) -> "ArrowTable":
@@ -425,6 +399,7 @@ class DuckDBDriver(
425
399
  Args:
426
400
  sql: The SQL query string.
427
401
  parameters: Parameters for the query.
402
+ *filters: Optional filters to apply to the SQL statement.
428
403
  connection: Optional connection override.
429
404
  **kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
430
405
 
@@ -432,10 +407,6 @@ class DuckDBDriver(
432
407
  An Apache Arrow Table containing the query results.
433
408
  """
434
409
  connection = self._connection(connection)
435
-
436
- # Extract filters from kwargs if present
437
- filters = kwargs.pop("filters", [])
438
-
439
410
  sql, parameters = self._process_sql_params(sql, parameters, *filters, **kwargs)
440
411
  with self._with_cursor(connection) as cursor:
441
412
  params = [] if parameters is None else parameters