sqlspec 0.14.1__py3-none-any.whl → 0.16.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/__init__.py +50 -25
- sqlspec/__main__.py +1 -1
- sqlspec/__metadata__.py +1 -3
- sqlspec/_serialization.py +1 -2
- sqlspec/_sql.py +480 -121
- sqlspec/_typing.py +278 -142
- sqlspec/adapters/adbc/__init__.py +4 -3
- sqlspec/adapters/adbc/_types.py +12 -0
- sqlspec/adapters/adbc/config.py +115 -260
- sqlspec/adapters/adbc/driver.py +462 -367
- sqlspec/adapters/aiosqlite/__init__.py +18 -3
- sqlspec/adapters/aiosqlite/_types.py +13 -0
- sqlspec/adapters/aiosqlite/config.py +199 -129
- sqlspec/adapters/aiosqlite/driver.py +230 -269
- sqlspec/adapters/asyncmy/__init__.py +18 -3
- sqlspec/adapters/asyncmy/_types.py +12 -0
- sqlspec/adapters/asyncmy/config.py +80 -168
- sqlspec/adapters/asyncmy/driver.py +260 -225
- sqlspec/adapters/asyncpg/__init__.py +19 -4
- sqlspec/adapters/asyncpg/_types.py +17 -0
- sqlspec/adapters/asyncpg/config.py +82 -181
- sqlspec/adapters/asyncpg/driver.py +285 -383
- sqlspec/adapters/bigquery/__init__.py +17 -3
- sqlspec/adapters/bigquery/_types.py +12 -0
- sqlspec/adapters/bigquery/config.py +191 -258
- sqlspec/adapters/bigquery/driver.py +474 -646
- sqlspec/adapters/duckdb/__init__.py +14 -3
- sqlspec/adapters/duckdb/_types.py +12 -0
- sqlspec/adapters/duckdb/config.py +415 -351
- sqlspec/adapters/duckdb/driver.py +343 -413
- sqlspec/adapters/oracledb/__init__.py +19 -5
- sqlspec/adapters/oracledb/_types.py +14 -0
- sqlspec/adapters/oracledb/config.py +123 -379
- sqlspec/adapters/oracledb/driver.py +507 -560
- sqlspec/adapters/psqlpy/__init__.py +13 -3
- sqlspec/adapters/psqlpy/_types.py +11 -0
- sqlspec/adapters/psqlpy/config.py +93 -254
- sqlspec/adapters/psqlpy/driver.py +505 -234
- sqlspec/adapters/psycopg/__init__.py +19 -5
- sqlspec/adapters/psycopg/_types.py +17 -0
- sqlspec/adapters/psycopg/config.py +143 -403
- sqlspec/adapters/psycopg/driver.py +706 -872
- sqlspec/adapters/sqlite/__init__.py +14 -3
- sqlspec/adapters/sqlite/_types.py +11 -0
- sqlspec/adapters/sqlite/config.py +202 -118
- sqlspec/adapters/sqlite/driver.py +264 -303
- sqlspec/base.py +105 -9
- sqlspec/{statement/builder → builder}/__init__.py +12 -14
- sqlspec/{statement/builder → builder}/_base.py +120 -55
- sqlspec/{statement/builder → builder}/_column.py +17 -6
- sqlspec/{statement/builder → builder}/_ddl.py +46 -79
- sqlspec/{statement/builder → builder}/_ddl_utils.py +5 -10
- sqlspec/{statement/builder → builder}/_delete.py +6 -25
- sqlspec/{statement/builder → builder}/_insert.py +18 -65
- sqlspec/builder/_merge.py +56 -0
- sqlspec/{statement/builder → builder}/_parsing_utils.py +8 -11
- sqlspec/{statement/builder → builder}/_select.py +11 -56
- sqlspec/{statement/builder → builder}/_update.py +12 -18
- sqlspec/{statement/builder → builder}/mixins/__init__.py +10 -14
- sqlspec/{statement/builder → builder}/mixins/_cte_and_set_ops.py +48 -59
- sqlspec/{statement/builder → builder}/mixins/_insert_operations.py +34 -18
- sqlspec/{statement/builder → builder}/mixins/_join_operations.py +1 -3
- sqlspec/{statement/builder → builder}/mixins/_merge_operations.py +19 -9
- sqlspec/{statement/builder → builder}/mixins/_order_limit_operations.py +3 -3
- sqlspec/{statement/builder → builder}/mixins/_pivot_operations.py +4 -8
- sqlspec/{statement/builder → builder}/mixins/_select_operations.py +25 -38
- sqlspec/{statement/builder → builder}/mixins/_update_operations.py +15 -16
- sqlspec/{statement/builder → builder}/mixins/_where_clause.py +210 -137
- sqlspec/cli.py +4 -5
- sqlspec/config.py +180 -133
- sqlspec/core/__init__.py +63 -0
- sqlspec/core/cache.py +873 -0
- sqlspec/core/compiler.py +396 -0
- sqlspec/core/filters.py +830 -0
- sqlspec/core/hashing.py +310 -0
- sqlspec/core/parameters.py +1209 -0
- sqlspec/core/result.py +664 -0
- sqlspec/{statement → core}/splitter.py +321 -191
- sqlspec/core/statement.py +666 -0
- sqlspec/driver/__init__.py +7 -10
- sqlspec/driver/_async.py +387 -176
- sqlspec/driver/_common.py +527 -289
- sqlspec/driver/_sync.py +390 -172
- sqlspec/driver/mixins/__init__.py +2 -19
- sqlspec/driver/mixins/_result_tools.py +164 -0
- sqlspec/driver/mixins/_sql_translator.py +6 -3
- sqlspec/exceptions.py +5 -252
- sqlspec/extensions/aiosql/adapter.py +93 -96
- sqlspec/extensions/litestar/cli.py +1 -1
- sqlspec/extensions/litestar/config.py +0 -1
- sqlspec/extensions/litestar/handlers.py +15 -26
- sqlspec/extensions/litestar/plugin.py +18 -16
- sqlspec/extensions/litestar/providers.py +17 -52
- sqlspec/loader.py +424 -105
- sqlspec/migrations/__init__.py +12 -0
- sqlspec/migrations/base.py +92 -68
- sqlspec/migrations/commands.py +24 -106
- sqlspec/migrations/loaders.py +402 -0
- sqlspec/migrations/runner.py +49 -51
- sqlspec/migrations/tracker.py +31 -44
- sqlspec/migrations/utils.py +64 -24
- sqlspec/protocols.py +7 -183
- sqlspec/storage/__init__.py +1 -1
- sqlspec/storage/backends/base.py +37 -40
- sqlspec/storage/backends/fsspec.py +136 -112
- sqlspec/storage/backends/obstore.py +138 -160
- sqlspec/storage/capabilities.py +5 -4
- sqlspec/storage/registry.py +57 -106
- sqlspec/typing.py +136 -115
- sqlspec/utils/__init__.py +2 -3
- sqlspec/utils/correlation.py +0 -3
- sqlspec/utils/deprecation.py +6 -6
- sqlspec/utils/fixtures.py +6 -6
- sqlspec/utils/logging.py +0 -2
- sqlspec/utils/module_loader.py +7 -12
- sqlspec/utils/singleton.py +0 -1
- sqlspec/utils/sync_tools.py +17 -38
- sqlspec/utils/text.py +12 -51
- sqlspec/utils/type_guards.py +443 -232
- {sqlspec-0.14.1.dist-info → sqlspec-0.16.0.dist-info}/METADATA +7 -2
- sqlspec-0.16.0.dist-info/RECORD +134 -0
- sqlspec/adapters/adbc/transformers.py +0 -108
- sqlspec/driver/connection.py +0 -207
- sqlspec/driver/mixins/_cache.py +0 -114
- sqlspec/driver/mixins/_csv_writer.py +0 -91
- sqlspec/driver/mixins/_pipeline.py +0 -508
- sqlspec/driver/mixins/_query_tools.py +0 -796
- sqlspec/driver/mixins/_result_utils.py +0 -138
- sqlspec/driver/mixins/_storage.py +0 -912
- sqlspec/driver/mixins/_type_coercion.py +0 -128
- sqlspec/driver/parameters.py +0 -138
- sqlspec/statement/__init__.py +0 -21
- sqlspec/statement/builder/_merge.py +0 -95
- sqlspec/statement/cache.py +0 -50
- sqlspec/statement/filters.py +0 -625
- sqlspec/statement/parameters.py +0 -956
- sqlspec/statement/pipelines/__init__.py +0 -210
- sqlspec/statement/pipelines/analyzers/__init__.py +0 -9
- sqlspec/statement/pipelines/analyzers/_analyzer.py +0 -646
- sqlspec/statement/pipelines/context.py +0 -109
- sqlspec/statement/pipelines/transformers/__init__.py +0 -7
- sqlspec/statement/pipelines/transformers/_expression_simplifier.py +0 -88
- sqlspec/statement/pipelines/transformers/_literal_parameterizer.py +0 -1247
- sqlspec/statement/pipelines/transformers/_remove_comments_and_hints.py +0 -76
- sqlspec/statement/pipelines/validators/__init__.py +0 -23
- sqlspec/statement/pipelines/validators/_dml_safety.py +0 -290
- sqlspec/statement/pipelines/validators/_parameter_style.py +0 -370
- sqlspec/statement/pipelines/validators/_performance.py +0 -714
- sqlspec/statement/pipelines/validators/_security.py +0 -967
- sqlspec/statement/result.py +0 -435
- sqlspec/statement/sql.py +0 -1774
- sqlspec/utils/cached_property.py +0 -25
- sqlspec/utils/statement_hashing.py +0 -203
- sqlspec-0.14.1.dist-info/RECORD +0 -145
- /sqlspec/{statement/builder → builder}/mixins/_delete_operations.py +0 -0
- {sqlspec-0.14.1.dist-info → sqlspec-0.16.0.dist-info}/WHEEL +0 -0
- {sqlspec-0.14.1.dist-info → sqlspec-0.16.0.dist-info}/entry_points.txt +0 -0
- {sqlspec-0.14.1.dist-info → sqlspec-0.16.0.dist-info}/licenses/LICENSE +0 -0
- {sqlspec-0.14.1.dist-info → sqlspec-0.16.0.dist-info}/licenses/NOTICE +0 -0
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
"""Result conversion utilities for unified storage architecture.
|
|
2
|
-
|
|
3
|
-
This module contains the result conversion functionality integrated with the unified
|
|
4
|
-
storage architecture.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import datetime
|
|
8
|
-
from collections.abc import Sequence
|
|
9
|
-
from enum import Enum
|
|
10
|
-
from functools import partial
|
|
11
|
-
from pathlib import Path, PurePath
|
|
12
|
-
from typing import Any, Callable, Optional, Union, cast, overload
|
|
13
|
-
from uuid import UUID
|
|
14
|
-
|
|
15
|
-
from sqlspec.exceptions import SQLSpecError, wrap_exceptions
|
|
16
|
-
from sqlspec.statement.result import OperationType
|
|
17
|
-
from sqlspec.typing import ModelDTOT, ModelT, convert, get_type_adapter
|
|
18
|
-
from sqlspec.utils.type_guards import is_dataclass, is_msgspec_struct, is_pydantic_model
|
|
19
|
-
|
|
20
|
-
__all__ = ("_DEFAULT_TYPE_DECODERS", "ToSchemaMixin", "_default_msgspec_deserializer")
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
_DEFAULT_TYPE_DECODERS: list[tuple[Callable[[Any], bool], Callable[[Any, Any], Any]]] = [
|
|
24
|
-
(lambda x: x is UUID, lambda t, v: t(v.hex)),
|
|
25
|
-
(lambda x: x is datetime.datetime, lambda t, v: t(v.isoformat())),
|
|
26
|
-
(lambda x: x is datetime.date, lambda t, v: t(v.isoformat())),
|
|
27
|
-
(lambda x: x is datetime.time, lambda t, v: t(v.isoformat())),
|
|
28
|
-
(lambda x: x is Enum, lambda t, v: t(v.value)),
|
|
29
|
-
]
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def _default_msgspec_deserializer(
|
|
33
|
-
target_type: Any, value: Any, type_decoders: "Optional[Sequence[tuple[Any, Any]]]" = None
|
|
34
|
-
) -> Any:
|
|
35
|
-
"""Default msgspec deserializer with type conversion support."""
|
|
36
|
-
if type_decoders:
|
|
37
|
-
for predicate, decoder in type_decoders:
|
|
38
|
-
if predicate(target_type):
|
|
39
|
-
return decoder(target_type, value)
|
|
40
|
-
if target_type is UUID and isinstance(value, UUID):
|
|
41
|
-
return value.hex
|
|
42
|
-
if target_type in {datetime.datetime, datetime.date, datetime.time}:
|
|
43
|
-
with wrap_exceptions(suppress=AttributeError):
|
|
44
|
-
return value.isoformat()
|
|
45
|
-
if isinstance(target_type, type) and issubclass(target_type, Enum) and isinstance(value, Enum):
|
|
46
|
-
return value.value
|
|
47
|
-
if isinstance(value, target_type):
|
|
48
|
-
return value
|
|
49
|
-
if issubclass(target_type, (Path, PurePath, UUID)):
|
|
50
|
-
return target_type(value)
|
|
51
|
-
return value
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
class ToSchemaMixin:
|
|
55
|
-
@staticmethod
|
|
56
|
-
def _determine_operation_type(statement: "Any") -> OperationType:
|
|
57
|
-
"""Determine operation type from SQL statement expression.
|
|
58
|
-
|
|
59
|
-
Args:
|
|
60
|
-
statement: SQL statement object with expression attribute
|
|
61
|
-
|
|
62
|
-
Returns:
|
|
63
|
-
OperationType literal value
|
|
64
|
-
"""
|
|
65
|
-
if not hasattr(statement, "expression") or not statement.expression:
|
|
66
|
-
return "EXECUTE"
|
|
67
|
-
|
|
68
|
-
expr_type = type(statement.expression).__name__.upper()
|
|
69
|
-
if "INSERT" in expr_type:
|
|
70
|
-
return "INSERT"
|
|
71
|
-
if "UPDATE" in expr_type:
|
|
72
|
-
return "UPDATE"
|
|
73
|
-
if "DELETE" in expr_type:
|
|
74
|
-
return "DELETE"
|
|
75
|
-
if "SELECT" in expr_type:
|
|
76
|
-
return "SELECT"
|
|
77
|
-
return "EXECUTE"
|
|
78
|
-
|
|
79
|
-
@overload
|
|
80
|
-
@staticmethod
|
|
81
|
-
def to_schema(data: "ModelT", *, schema_type: None = None) -> "ModelT": ...
|
|
82
|
-
@overload
|
|
83
|
-
@staticmethod
|
|
84
|
-
def to_schema(data: "dict[str, Any]", *, schema_type: "type[ModelDTOT]") -> "ModelDTOT": ...
|
|
85
|
-
@overload
|
|
86
|
-
@staticmethod
|
|
87
|
-
def to_schema(data: "Sequence[ModelT]", *, schema_type: None = None) -> "Sequence[ModelT]": ...
|
|
88
|
-
@overload
|
|
89
|
-
@staticmethod
|
|
90
|
-
def to_schema(data: "Sequence[dict[str, Any]]", *, schema_type: "type[ModelDTOT]") -> "Sequence[ModelDTOT]": ...
|
|
91
|
-
|
|
92
|
-
@staticmethod
|
|
93
|
-
def to_schema(
|
|
94
|
-
data: "Union[ModelT, dict[str, Any], Sequence[ModelT], Sequence[dict[str, Any]]]",
|
|
95
|
-
*,
|
|
96
|
-
schema_type: "Optional[type[ModelDTOT]]" = None,
|
|
97
|
-
) -> "Union[ModelT, ModelDTOT, Sequence[ModelT], Sequence[ModelDTOT]]":
|
|
98
|
-
"""Convert data to a specified schema type."""
|
|
99
|
-
if schema_type is None:
|
|
100
|
-
if not isinstance(data, Sequence):
|
|
101
|
-
return cast("ModelT", data)
|
|
102
|
-
return cast("Sequence[ModelT]", data)
|
|
103
|
-
if is_dataclass(schema_type):
|
|
104
|
-
if not isinstance(data, Sequence):
|
|
105
|
-
return cast("ModelDTOT", schema_type(**data)) # type: ignore[operator]
|
|
106
|
-
return cast("Sequence[ModelDTOT]", [schema_type(**item) for item in data]) # type: ignore[operator]
|
|
107
|
-
if is_msgspec_struct(schema_type):
|
|
108
|
-
if not isinstance(data, Sequence):
|
|
109
|
-
return cast(
|
|
110
|
-
"ModelDTOT",
|
|
111
|
-
convert(
|
|
112
|
-
obj=data,
|
|
113
|
-
type=schema_type,
|
|
114
|
-
from_attributes=True,
|
|
115
|
-
dec_hook=partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS),
|
|
116
|
-
),
|
|
117
|
-
)
|
|
118
|
-
return cast(
|
|
119
|
-
"Sequence[ModelDTOT]",
|
|
120
|
-
convert(
|
|
121
|
-
obj=data,
|
|
122
|
-
type=list[schema_type], # type: ignore[valid-type] # pyright: ignore
|
|
123
|
-
from_attributes=True,
|
|
124
|
-
dec_hook=partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS),
|
|
125
|
-
),
|
|
126
|
-
)
|
|
127
|
-
if schema_type is not None and is_pydantic_model(schema_type):
|
|
128
|
-
if not isinstance(data, Sequence):
|
|
129
|
-
return cast(
|
|
130
|
-
"ModelDTOT",
|
|
131
|
-
get_type_adapter(schema_type).validate_python(data, from_attributes=True), # pyright: ignore
|
|
132
|
-
)
|
|
133
|
-
return cast(
|
|
134
|
-
"Sequence[ModelDTOT]",
|
|
135
|
-
get_type_adapter(list[schema_type]).validate_python(data, from_attributes=True), # type: ignore[valid-type] # pyright: ignore
|
|
136
|
-
)
|
|
137
|
-
msg = "`schema_type` should be a valid Dataclass, Pydantic model or Msgspec struct"
|
|
138
|
-
raise SQLSpecError(msg)
|