sqlspec 0.16.0__py3-none-any.whl → 0.16.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sqlspec might be problematic. Click here for more details.
- sqlspec/_sql.py +448 -15
- sqlspec/builder/_base.py +77 -44
- sqlspec/builder/_column.py +0 -4
- sqlspec/builder/_ddl.py +15 -52
- sqlspec/builder/_ddl_utils.py +0 -1
- sqlspec/builder/_delete.py +4 -5
- sqlspec/builder/_insert.py +59 -44
- sqlspec/builder/_merge.py +17 -2
- sqlspec/builder/_parsing_utils.py +11 -11
- sqlspec/builder/_select.py +29 -33
- sqlspec/builder/_update.py +4 -2
- sqlspec/builder/mixins/_cte_and_set_ops.py +47 -20
- sqlspec/builder/mixins/_delete_operations.py +6 -1
- sqlspec/builder/mixins/_insert_operations.py +126 -34
- sqlspec/builder/mixins/_join_operations.py +11 -4
- sqlspec/builder/mixins/_merge_operations.py +81 -21
- sqlspec/builder/mixins/_order_limit_operations.py +15 -3
- sqlspec/builder/mixins/_pivot_operations.py +11 -2
- sqlspec/builder/mixins/_select_operations.py +12 -8
- sqlspec/builder/mixins/_update_operations.py +37 -14
- sqlspec/builder/mixins/_where_clause.py +55 -43
- sqlspec/core/cache.py +26 -28
- sqlspec/core/compiler.py +58 -37
- sqlspec/core/parameters.py +80 -52
- sqlspec/core/result.py +30 -17
- sqlspec/core/statement.py +31 -21
- sqlspec/driver/_async.py +76 -46
- sqlspec/driver/_common.py +25 -6
- sqlspec/driver/_sync.py +73 -43
- sqlspec/driver/mixins/_result_tools.py +51 -22
- sqlspec/driver/mixins/_sql_translator.py +61 -11
- sqlspec/protocols.py +7 -0
- sqlspec/utils/type_guards.py +7 -3
- {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/METADATA +1 -1
- {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/RECORD +39 -39
- {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/WHEEL +0 -0
- {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/entry_points.txt +0 -0
- {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/licenses/LICENSE +0 -0
- {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/licenses/NOTICE +0 -0
|
@@ -5,12 +5,12 @@ from collections.abc import Sequence
|
|
|
5
5
|
from enum import Enum
|
|
6
6
|
from functools import partial
|
|
7
7
|
from pathlib import Path, PurePath
|
|
8
|
-
from typing import Any, Callable, Optional, overload
|
|
8
|
+
from typing import Any, Callable, Final, Optional, overload
|
|
9
9
|
from uuid import UUID
|
|
10
10
|
|
|
11
11
|
from mypy_extensions import trait
|
|
12
12
|
|
|
13
|
-
from sqlspec.exceptions import SQLSpecError
|
|
13
|
+
from sqlspec.exceptions import SQLSpecError
|
|
14
14
|
from sqlspec.typing import (
|
|
15
15
|
CATTRS_INSTALLED,
|
|
16
16
|
ModelDTOT,
|
|
@@ -27,7 +27,12 @@ __all__ = ("_DEFAULT_TYPE_DECODERS", "_default_msgspec_deserializer")
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
logger = logging.getLogger(__name__)
|
|
30
|
-
|
|
30
|
+
|
|
31
|
+
# Constants for performance optimization
|
|
32
|
+
_DATETIME_TYPES: Final[set[type]] = {datetime.datetime, datetime.date, datetime.time}
|
|
33
|
+
_PATH_TYPES: Final[tuple[type, ...]] = (Path, PurePath, UUID)
|
|
34
|
+
|
|
35
|
+
_DEFAULT_TYPE_DECODERS: Final[list[tuple[Callable[[Any], bool], Callable[[Any, Any], Any]]]] = [
|
|
31
36
|
(lambda x: x is UUID, lambda t, v: t(v.hex)),
|
|
32
37
|
(lambda x: x is datetime.datetime, lambda t, v: t(v.isoformat())),
|
|
33
38
|
(lambda x: x is datetime.date, lambda t, v: t(v.isoformat())),
|
|
@@ -48,17 +53,32 @@ def _default_msgspec_deserializer(
|
|
|
48
53
|
for predicate, decoder in type_decoders:
|
|
49
54
|
if predicate(target_type):
|
|
50
55
|
return decoder(target_type, value)
|
|
56
|
+
|
|
57
|
+
# Fast path checks using type identity and isinstance
|
|
51
58
|
if target_type is UUID and isinstance(value, UUID):
|
|
52
59
|
return value.hex
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
|
|
61
|
+
# Use pre-computed set for faster lookup
|
|
62
|
+
if target_type in _DATETIME_TYPES:
|
|
63
|
+
try:
|
|
55
64
|
return value.isoformat()
|
|
65
|
+
except AttributeError:
|
|
66
|
+
pass
|
|
67
|
+
|
|
56
68
|
if isinstance(target_type, type) and issubclass(target_type, Enum) and isinstance(value, Enum):
|
|
57
69
|
return value.value
|
|
70
|
+
|
|
58
71
|
if isinstance(value, target_type):
|
|
59
72
|
return value
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
|
|
74
|
+
# Check for path types using pre-computed tuple
|
|
75
|
+
if isinstance(target_type, type):
|
|
76
|
+
try:
|
|
77
|
+
if issubclass(target_type, (Path, PurePath)) or issubclass(target_type, UUID):
|
|
78
|
+
return target_type(str(value))
|
|
79
|
+
except (TypeError, ValueError):
|
|
80
|
+
pass
|
|
81
|
+
|
|
62
82
|
return value
|
|
63
83
|
|
|
64
84
|
|
|
@@ -119,46 +139,55 @@ class ToSchemaMixin:
|
|
|
119
139
|
return data
|
|
120
140
|
if is_dataclass(schema_type):
|
|
121
141
|
if isinstance(data, list):
|
|
122
|
-
|
|
142
|
+
result: list[Any] = []
|
|
143
|
+
for item in data:
|
|
144
|
+
if hasattr(item, "keys"):
|
|
145
|
+
result.append(schema_type(**dict(item))) # type: ignore[operator]
|
|
146
|
+
else:
|
|
147
|
+
result.append(item)
|
|
148
|
+
return result
|
|
123
149
|
if hasattr(data, "keys"):
|
|
124
150
|
return schema_type(**dict(data)) # type: ignore[operator]
|
|
125
151
|
if isinstance(data, dict):
|
|
126
152
|
return schema_type(**data) # type: ignore[operator]
|
|
127
|
-
# Fallback for other types
|
|
128
153
|
return data
|
|
129
154
|
if is_msgspec_struct(schema_type):
|
|
155
|
+
# Cache the deserializer to avoid repeated partial() calls
|
|
156
|
+
deserializer = partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS)
|
|
130
157
|
if not isinstance(data, Sequence):
|
|
131
|
-
return convert(
|
|
132
|
-
obj=data,
|
|
133
|
-
type=schema_type,
|
|
134
|
-
from_attributes=True,
|
|
135
|
-
dec_hook=partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS),
|
|
136
|
-
)
|
|
158
|
+
return convert(obj=data, type=schema_type, from_attributes=True, dec_hook=deserializer)
|
|
137
159
|
return convert(
|
|
138
160
|
obj=data,
|
|
139
161
|
type=list[schema_type], # type: ignore[valid-type] # pyright: ignore
|
|
140
162
|
from_attributes=True,
|
|
141
|
-
dec_hook=
|
|
163
|
+
dec_hook=deserializer,
|
|
142
164
|
)
|
|
143
165
|
if is_pydantic_model(schema_type):
|
|
144
166
|
if not isinstance(data, Sequence):
|
|
145
|
-
|
|
146
|
-
|
|
167
|
+
adapter = get_type_adapter(schema_type)
|
|
168
|
+
return adapter.validate_python(data, from_attributes=True) # pyright: ignore
|
|
169
|
+
list_adapter = get_type_adapter(list[schema_type]) # type: ignore[valid-type] # pyright: ignore
|
|
170
|
+
return list_adapter.validate_python(data, from_attributes=True)
|
|
147
171
|
if is_attrs_schema(schema_type):
|
|
148
172
|
if CATTRS_INSTALLED:
|
|
149
173
|
if isinstance(data, Sequence):
|
|
150
174
|
return cattrs_structure(data, list[schema_type]) # type: ignore[valid-type] # pyright: ignore
|
|
151
|
-
# If data is already structured (attrs instance), unstructure it first
|
|
152
175
|
if hasattr(data, "__attrs_attrs__"):
|
|
153
|
-
|
|
176
|
+
unstructured_data = cattrs_unstructure(data)
|
|
177
|
+
return cattrs_structure(unstructured_data, schema_type) # pyright: ignore
|
|
154
178
|
return cattrs_structure(data, schema_type) # pyright: ignore
|
|
155
179
|
if isinstance(data, list):
|
|
156
|
-
|
|
180
|
+
attrs_result: list[Any] = []
|
|
181
|
+
for item in data:
|
|
182
|
+
if hasattr(item, "keys"):
|
|
183
|
+
attrs_result.append(schema_type(**dict(item)))
|
|
184
|
+
else:
|
|
185
|
+
attrs_result.append(schema_type(**attrs_asdict(item)))
|
|
186
|
+
return attrs_result
|
|
157
187
|
if hasattr(data, "keys"):
|
|
158
188
|
return schema_type(**dict(data))
|
|
159
189
|
if isinstance(data, dict):
|
|
160
190
|
return schema_type(**data)
|
|
161
|
-
# Fallback for other types
|
|
162
191
|
return data
|
|
163
192
|
msg = "`schema_type` should be a valid Dataclass, Pydantic model, Msgspec struct, or Attrs class"
|
|
164
193
|
raise SQLSpecError(msg)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Final, NoReturn, Optional
|
|
2
|
+
|
|
1
3
|
from mypy_extensions import trait
|
|
2
4
|
from sqlglot import exp, parse_one
|
|
3
5
|
from sqlglot.dialects.dialect import DialectType
|
|
@@ -7,6 +9,9 @@ from sqlspec.exceptions import SQLConversionError
|
|
|
7
9
|
|
|
8
10
|
__all__ = ("SQLTranslatorMixin",)
|
|
9
11
|
|
|
12
|
+
# Constants for better performance
|
|
13
|
+
_DEFAULT_PRETTY: Final[bool] = True
|
|
14
|
+
|
|
10
15
|
|
|
11
16
|
@trait
|
|
12
17
|
class SQLTranslatorMixin:
|
|
@@ -14,23 +19,68 @@ class SQLTranslatorMixin:
|
|
|
14
19
|
|
|
15
20
|
__slots__ = ()
|
|
16
21
|
|
|
17
|
-
def convert_to_dialect(
|
|
22
|
+
def convert_to_dialect(
|
|
23
|
+
self, statement: "Statement", to_dialect: "Optional[DialectType]" = None, pretty: bool = _DEFAULT_PRETTY
|
|
24
|
+
) -> str:
|
|
25
|
+
"""Convert a statement to a target SQL dialect.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
statement: SQL statement to convert
|
|
29
|
+
to_dialect: Target dialect (defaults to current dialect)
|
|
30
|
+
pretty: Whether to format the output SQL
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
SQL string in target dialect
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
SQLConversionError: If parsing or conversion fails
|
|
37
|
+
"""
|
|
38
|
+
# Fast path: get the parsed expression with minimal allocations
|
|
39
|
+
parsed_expression: Optional[exp.Expression] = None
|
|
40
|
+
|
|
18
41
|
if statement is not None and isinstance(statement, SQL):
|
|
19
42
|
if statement.expression is None:
|
|
20
|
-
|
|
21
|
-
raise SQLConversionError(msg)
|
|
43
|
+
self._raise_statement_parse_error()
|
|
22
44
|
parsed_expression = statement.expression
|
|
23
45
|
elif isinstance(statement, exp.Expression):
|
|
24
46
|
parsed_expression = statement
|
|
25
47
|
else:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
error_msg = f"Failed to parse SQL statement: {e!s}"
|
|
30
|
-
raise SQLConversionError(error_msg) from e
|
|
48
|
+
parsed_expression = self._parse_statement_safely(statement)
|
|
49
|
+
|
|
50
|
+
# Get target dialect with fallback
|
|
31
51
|
target_dialect = to_dialect or self.dialect # type: ignore[attr-defined]
|
|
52
|
+
|
|
53
|
+
# Generate SQL with error handling
|
|
54
|
+
return self._generate_sql_safely(parsed_expression, target_dialect, pretty)
|
|
55
|
+
|
|
56
|
+
def _parse_statement_safely(self, statement: "Statement") -> "exp.Expression":
|
|
57
|
+
"""Parse statement with copy=False optimization and proper error handling."""
|
|
58
|
+
try:
|
|
59
|
+
# Convert statement to string if needed
|
|
60
|
+
sql_string = str(statement)
|
|
61
|
+
# Use copy=False for better performance
|
|
62
|
+
return parse_one(sql_string, dialect=self.dialect, copy=False) # type: ignore[attr-defined]
|
|
63
|
+
except Exception as e:
|
|
64
|
+
self._raise_parse_error(e)
|
|
65
|
+
|
|
66
|
+
def _generate_sql_safely(self, expression: "exp.Expression", dialect: DialectType, pretty: bool) -> str:
|
|
67
|
+
"""Generate SQL with proper error handling."""
|
|
32
68
|
try:
|
|
33
|
-
return
|
|
69
|
+
return expression.sql(dialect=dialect, pretty=pretty)
|
|
34
70
|
except Exception as e:
|
|
35
|
-
|
|
36
|
-
|
|
71
|
+
self._raise_conversion_error(dialect, e)
|
|
72
|
+
|
|
73
|
+
def _raise_statement_parse_error(self) -> NoReturn:
|
|
74
|
+
"""Raise error for unparsable statements."""
|
|
75
|
+
msg = "Statement could not be parsed"
|
|
76
|
+
raise SQLConversionError(msg)
|
|
77
|
+
|
|
78
|
+
def _raise_parse_error(self, e: Exception) -> NoReturn:
|
|
79
|
+
"""Raise error for parsing failures."""
|
|
80
|
+
error_msg = f"Failed to parse SQL statement: {e!s}"
|
|
81
|
+
raise SQLConversionError(error_msg) from e
|
|
82
|
+
|
|
83
|
+
def _raise_conversion_error(self, dialect: DialectType, e: Exception) -> NoReturn:
|
|
84
|
+
"""Raise error for conversion failures."""
|
|
85
|
+
error_msg = f"Failed to convert SQL expression to {dialect}: {e!s}"
|
|
86
|
+
raise SQLConversionError(error_msg) from e
|
sqlspec/protocols.py
CHANGED
|
@@ -371,6 +371,9 @@ class SQLBuilderProtocol(Protocol):
|
|
|
371
371
|
_expression: "Optional[exp.Expression]"
|
|
372
372
|
_parameters: dict[str, Any]
|
|
373
373
|
_parameter_counter: int
|
|
374
|
+
_columns: Any # Optional attribute for some builders
|
|
375
|
+
_table: Any # Optional attribute for some builders
|
|
376
|
+
_with_ctes: Any # Optional attribute for some builders
|
|
374
377
|
dialect: Any
|
|
375
378
|
dialect_name: "Optional[str]"
|
|
376
379
|
|
|
@@ -383,6 +386,10 @@ class SQLBuilderProtocol(Protocol):
|
|
|
383
386
|
"""Add a parameter to the builder."""
|
|
384
387
|
...
|
|
385
388
|
|
|
389
|
+
def _generate_unique_parameter_name(self, base_name: str) -> str:
|
|
390
|
+
"""Generate a unique parameter name."""
|
|
391
|
+
...
|
|
392
|
+
|
|
386
393
|
def _parameterize_expression(self, expression: "exp.Expression") -> "exp.Expression":
|
|
387
394
|
"""Replace literal values in an expression with bound parameters."""
|
|
388
395
|
...
|
sqlspec/utils/type_guards.py
CHANGED
|
@@ -841,9 +841,13 @@ def has_sql_method(obj: Any) -> "TypeGuard[HasSQLMethodProtocol]":
|
|
|
841
841
|
|
|
842
842
|
def has_query_builder_parameters(obj: Any) -> "TypeGuard[SQLBuilderProtocol]":
|
|
843
843
|
"""Check if an object is a query builder with parameters property."""
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
844
|
+
return (
|
|
845
|
+
hasattr(obj, "build")
|
|
846
|
+
and callable(getattr(obj, "build", None))
|
|
847
|
+
and hasattr(obj, "parameters")
|
|
848
|
+
and hasattr(obj, "add_parameter")
|
|
849
|
+
and callable(getattr(obj, "add_parameter", None))
|
|
850
|
+
)
|
|
847
851
|
|
|
848
852
|
|
|
849
853
|
def is_object_store_item(obj: Any) -> "TypeGuard[ObjectStoreItemProtocol]":
|
|
@@ -2,14 +2,14 @@ sqlspec/__init__.py,sha256=8_TR9bXd7bkA4qBGCzTHNawH7KXaJ4YlnCJzJwvgud8,2066
|
|
|
2
2
|
sqlspec/__main__.py,sha256=lXBKZMOXA1uY735Rnsb-GS7aXy0nt22tYmd2X9FcxrY,253
|
|
3
3
|
sqlspec/__metadata__.py,sha256=IUw6MCTy1oeUJ1jAVYbuJLkOWbiAWorZ5W-E-SAD9N4,395
|
|
4
4
|
sqlspec/_serialization.py,sha256=6U5-smk2h2yl0i6am2prtOLJTdu4NJQdcLlSfSUMaUQ,2590
|
|
5
|
-
sqlspec/_sql.py,sha256=
|
|
5
|
+
sqlspec/_sql.py,sha256=pIRc-jp_qkXSFvsZISlVRR_n8c3FYg7kY5oPJ_jYKbs,60372
|
|
6
6
|
sqlspec/_typing.py,sha256=jv-7QHGLrJLfnP86bR-Xcmj3PDoddNZEKDz_vYRBiAU,22684
|
|
7
7
|
sqlspec/base.py,sha256=lVLzFD-nzEU6QnwnU0kRWh3XWjbvXWX0XnnUViYBoQk,21767
|
|
8
8
|
sqlspec/cli.py,sha256=3ZxPwl4neNWyrAkM9J9ccC_gaFigDJbhuZfx15JVE7E,9903
|
|
9
9
|
sqlspec/config.py,sha256=s7csxGK0SlTvB9jOvHlKKm4Y272RInQrUd6hGXwy31Q,14974
|
|
10
10
|
sqlspec/exceptions.py,sha256=mCqNJ0JSPA-TUPpAfdctwwqJWbiNsWap5ATNNRdczwU,6159
|
|
11
11
|
sqlspec/loader.py,sha256=sIK4I8L1Qe6hyoi6OHuaaAUUTdj4UrsRca16fuMs8HM,27259
|
|
12
|
-
sqlspec/protocols.py,sha256=
|
|
12
|
+
sqlspec/protocols.py,sha256=iwwy7zdIBV7TcoxIYpKuTvN5fGiULQac2f4a-saxyKU,12937
|
|
13
13
|
sqlspec/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
sqlspec/typing.py,sha256=JEq2VsTaLdNZ1HAqj3n_HgQgdwlQQOCcZx3VBiPs0UA,7393
|
|
15
15
|
sqlspec/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -54,43 +54,43 @@ sqlspec/adapters/sqlite/_types.py,sha256=4Nqolhk8s4mwLw13BwUjuyhAbM9BsKwJCvcmjMW
|
|
|
54
54
|
sqlspec/adapters/sqlite/config.py,sha256=jTomeuHahwMN9huOnQclAuJyiFL1m8hoexQxWCn0Ckg,9166
|
|
55
55
|
sqlspec/adapters/sqlite/driver.py,sha256=uAhasoCNOV30gTvl1EUpofRcm8YiEW5RnVy07XyypzI,12103
|
|
56
56
|
sqlspec/builder/__init__.py,sha256=E3UGimdSOUK_ZGxFEOsCduwWWwTxcqoLe3Rvh4KbGNY,1429
|
|
57
|
-
sqlspec/builder/_base.py,sha256=
|
|
58
|
-
sqlspec/builder/_column.py,sha256=
|
|
59
|
-
sqlspec/builder/_ddl.py,sha256=
|
|
60
|
-
sqlspec/builder/_ddl_utils.py,sha256=
|
|
61
|
-
sqlspec/builder/_delete.py,sha256=
|
|
62
|
-
sqlspec/builder/_insert.py,sha256=
|
|
63
|
-
sqlspec/builder/_merge.py,sha256=
|
|
64
|
-
sqlspec/builder/_parsing_utils.py,sha256=
|
|
65
|
-
sqlspec/builder/_select.py,sha256=
|
|
66
|
-
sqlspec/builder/_update.py,sha256=
|
|
57
|
+
sqlspec/builder/_base.py,sha256=yz-6e-x66vrNne6z5zq4Ae0C3p0mHEEIe1Y8er-A0pg,17812
|
|
58
|
+
sqlspec/builder/_column.py,sha256=46baZj403BKfGjZcMc9LtQfMLeMQ7ROPyFL64V7dDM0,13124
|
|
59
|
+
sqlspec/builder/_ddl.py,sha256=A_fV4d92o2ZOhX150YMSsQDm3veQTQrwlxgLdFMBBfg,48184
|
|
60
|
+
sqlspec/builder/_ddl_utils.py,sha256=1mFSNe9w5rZXA1Ud4CTuca7eibi0XayHrIPcnEgRB7s,4034
|
|
61
|
+
sqlspec/builder/_delete.py,sha256=xWA5nQB3UB8kpEGXN2k5ynt4cGZ7blkNoURpI0bKoeg,2264
|
|
62
|
+
sqlspec/builder/_insert.py,sha256=L3BiVOcbSbRGscqINU2LCoKn7G6FqDCONGq3D-xS4JY,9522
|
|
63
|
+
sqlspec/builder/_merge.py,sha256=95PLQSKA3zjk0wTZG3m817fTZpsS95PrS2qF34iLAP8,2004
|
|
64
|
+
sqlspec/builder/_parsing_utils.py,sha256=d8zpI3rVdDhA_BfSP9NMHCayS4-Ve83YiAnlYX-bkBE,5644
|
|
65
|
+
sqlspec/builder/_select.py,sha256=m5sfyuAssjlNimLLNBAeFooVIfM2FgKN1boPfdsOkaA,5785
|
|
66
|
+
sqlspec/builder/_update.py,sha256=UFHM_uWVY5RnZQ6winiyjKNtBryKRAXJlXtCVQdifyw,6015
|
|
67
67
|
sqlspec/builder/mixins/__init__.py,sha256=YXhAzKmQbQtne5j26SKWY8PUxwosl0RhlhLoahAdkj0,1885
|
|
68
|
-
sqlspec/builder/mixins/_cte_and_set_ops.py,sha256=
|
|
69
|
-
sqlspec/builder/mixins/_delete_operations.py,sha256=
|
|
70
|
-
sqlspec/builder/mixins/_insert_operations.py,sha256=
|
|
71
|
-
sqlspec/builder/mixins/_join_operations.py,sha256=
|
|
72
|
-
sqlspec/builder/mixins/_merge_operations.py,sha256=
|
|
73
|
-
sqlspec/builder/mixins/_order_limit_operations.py,sha256=
|
|
74
|
-
sqlspec/builder/mixins/_pivot_operations.py,sha256=
|
|
75
|
-
sqlspec/builder/mixins/_select_operations.py,sha256=
|
|
76
|
-
sqlspec/builder/mixins/_update_operations.py,sha256=
|
|
77
|
-
sqlspec/builder/mixins/_where_clause.py,sha256=
|
|
68
|
+
sqlspec/builder/mixins/_cte_and_set_ops.py,sha256=p5O9m_jvpaWxv1XP9Ys2DRI-qOTq30rr2EwYjAbIT8o,9088
|
|
69
|
+
sqlspec/builder/mixins/_delete_operations.py,sha256=l0liajnoAfRgtWtyStuAIfxreEFRkNO4DtBwyGqAfic,1198
|
|
70
|
+
sqlspec/builder/mixins/_insert_operations.py,sha256=3ZuVNAPgJG0fzOPaprwUPa0Un3NP7erHwtCg8AGZWD8,9500
|
|
71
|
+
sqlspec/builder/mixins/_join_operations.py,sha256=jbJlNifGqxjsTfskrpUdW7wLjJtT7U3sNCfZKUQewRI,5597
|
|
72
|
+
sqlspec/builder/mixins/_merge_operations.py,sha256=9y07xis3WfE2nAm1jsSHu2dea4SM6Zy5fr0aAYkz6yw,19741
|
|
73
|
+
sqlspec/builder/mixins/_order_limit_operations.py,sha256=ABPuFSqHRv7XaS9-3HNZO3Jn0QovhJrkYT158xxduns,4835
|
|
74
|
+
sqlspec/builder/mixins/_pivot_operations.py,sha256=j5vdzXuEqB1Jn3Ie_QjVwSH2_OEi65oZ64bQJHd3jXo,6108
|
|
75
|
+
sqlspec/builder/mixins/_select_operations.py,sha256=jJmrZEg0dbC1BRjmZnImkxGgiy7S2TgAePC0zLEPzuk,24946
|
|
76
|
+
sqlspec/builder/mixins/_update_operations.py,sha256=0QblziF4NAKx8IwAOXUAvXOv-zrvf1C8LgTDlwmRD14,8085
|
|
77
|
+
sqlspec/builder/mixins/_where_clause.py,sha256=LcZh2ZqAHP_lX3tZIALVkXFaDngldDYsP4CjMD4qqWc,32475
|
|
78
78
|
sqlspec/core/__init__.py,sha256=rU_xGsXhqIOnBbyB2InhJknYePm5NQ2DSWdBigror4g,1775
|
|
79
|
-
sqlspec/core/cache.py,sha256=
|
|
80
|
-
sqlspec/core/compiler.py,sha256=
|
|
79
|
+
sqlspec/core/cache.py,sha256=cLL9bd5wn1oeMzn5E5Ym0sAemA8U4QP6B55x4L9-26I,27044
|
|
80
|
+
sqlspec/core/compiler.py,sha256=pfBRrMFvrNuCwQgzKNljNTYH3imARlek3Ja5mJkHI88,14652
|
|
81
81
|
sqlspec/core/filters.py,sha256=X0wRd0vNOFgeOK98ReeTyKt408GCnnmE9p45Bvur3kw,31351
|
|
82
82
|
sqlspec/core/hashing.py,sha256=4KyAFWtFDMYreoBGGPQppEuMWO6_NrRYlw9Lm-qeJqo,10429
|
|
83
|
-
sqlspec/core/parameters.py,sha256=
|
|
84
|
-
sqlspec/core/result.py,sha256=
|
|
83
|
+
sqlspec/core/parameters.py,sha256=yLnGt_tqqpb28xrgnq3oQ-1mcf45Pjf6uE3c0ag5JJ4,54265
|
|
84
|
+
sqlspec/core/result.py,sha256=VnxiTW7m6QfQkKRA8U_WtX198HelX2TCHd4aKPmKHHo,21340
|
|
85
85
|
sqlspec/core/splitter.py,sha256=cb2P1B0q5vvALHi3SEJ7VdbRHH2GWsftrmJi9PYMbeE,28089
|
|
86
|
-
sqlspec/core/statement.py,sha256=
|
|
86
|
+
sqlspec/core/statement.py,sha256=HsbSu0qnfJzpL_s1kwfxtWnyuCfAq8WjYRc3YQqxkDw,25700
|
|
87
87
|
sqlspec/driver/__init__.py,sha256=QVpDRQGd1GreIP199en6qDbq-cZJcEF5go68DINagUk,569
|
|
88
|
-
sqlspec/driver/_async.py,sha256=
|
|
89
|
-
sqlspec/driver/_common.py,sha256=
|
|
90
|
-
sqlspec/driver/_sync.py,sha256=
|
|
88
|
+
sqlspec/driver/_async.py,sha256=29XYWjeIuIwElO3QFUtEqQZq1ss2Ulueh0UD-aX2x-E,19636
|
|
89
|
+
sqlspec/driver/_common.py,sha256=bjJCBfM5YaU-98vEnEc5qFcjWvaUVEcQS6v3gGC0UKw,26313
|
|
90
|
+
sqlspec/driver/_sync.py,sha256=pCKNHj46HcZYn9292FWyoWkNc6gj4ArUT8ttik4YyRQ,19408
|
|
91
91
|
sqlspec/driver/mixins/__init__.py,sha256=gN4pQyJXxNy0xi91dcMJGA7DQ7TbjGjQI24SSpZc6Go,248
|
|
92
|
-
sqlspec/driver/mixins/_result_tools.py,sha256=
|
|
93
|
-
sqlspec/driver/mixins/_sql_translator.py,sha256=
|
|
92
|
+
sqlspec/driver/mixins/_result_tools.py,sha256=8z-W4py3BOtn3WB7ElpsVAEjGRozgHsfymTE_oXqcnw,7576
|
|
93
|
+
sqlspec/driver/mixins/_sql_translator.py,sha256=jmwlocjSqj-ZMfssMva6GR8t-CRlDVwU3ec2ve0l3JE,3322
|
|
94
94
|
sqlspec/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
95
95
|
sqlspec/extensions/aiosql/__init__.py,sha256=-9cefc9pYPf9vCgALoB-y1DtmcgRjKe2azfl6RIarAA,414
|
|
96
96
|
sqlspec/extensions/aiosql/adapter.py,sha256=CXkNZaZq86ZhfYFGx4IFbkHmbIFQKMd9CS6Q2jkMCok,16009
|
|
@@ -125,10 +125,10 @@ sqlspec/utils/serializers.py,sha256=TKsRryRcYMnb8Z8MGkYGClIxcYvC8CW7MsrPQTJqEcY,
|
|
|
125
125
|
sqlspec/utils/singleton.py,sha256=SKnszJi1NPeERgX7IjVIGYAYx4XqR1E_rph3bU6olAU,1047
|
|
126
126
|
sqlspec/utils/sync_tools.py,sha256=WRuk1ZEhb_0CRrumAdnmi-i-dV6qVd3cgJyZw8RY9QQ,7390
|
|
127
127
|
sqlspec/utils/text.py,sha256=n5K0gvXvyCc8jNteNKsBOymwf_JnQ65f3lu0YaYq4Ys,2898
|
|
128
|
-
sqlspec/utils/type_guards.py,sha256=
|
|
129
|
-
sqlspec-0.16.
|
|
130
|
-
sqlspec-0.16.
|
|
131
|
-
sqlspec-0.16.
|
|
132
|
-
sqlspec-0.16.
|
|
133
|
-
sqlspec-0.16.
|
|
134
|
-
sqlspec-0.16.
|
|
128
|
+
sqlspec/utils/type_guards.py,sha256=9C4SRebO4JiQrMzcJZFUA0KjSU48G26RmX6lbijyjBg,30476
|
|
129
|
+
sqlspec-0.16.1.dist-info/METADATA,sha256=1qzVVweBzJeGdf5YDTy23s4hBBH8ePnHU09sfi_IzAc,16822
|
|
130
|
+
sqlspec-0.16.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
131
|
+
sqlspec-0.16.1.dist-info/entry_points.txt,sha256=G-ZqY1Nuuw3Iys7nXw23f6ILenk_Lt47VdK2mhJCWHg,53
|
|
132
|
+
sqlspec-0.16.1.dist-info/licenses/LICENSE,sha256=MdujfZ6l5HuLz4mElxlu049itenOR3gnhN1_Nd3nVcM,1078
|
|
133
|
+
sqlspec-0.16.1.dist-info/licenses/NOTICE,sha256=Lyir8ozXWov7CyYS4huVaOCNrtgL17P-bNV-5daLntQ,1634
|
|
134
|
+
sqlspec-0.16.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|