sqlspec 0.26.0__py3-none-any.whl → 0.27.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.

Files changed (197) hide show
  1. sqlspec/__init__.py +7 -15
  2. sqlspec/_serialization.py +55 -25
  3. sqlspec/_typing.py +62 -52
  4. sqlspec/adapters/adbc/_types.py +1 -1
  5. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  6. sqlspec/adapters/adbc/adk/store.py +870 -0
  7. sqlspec/adapters/adbc/config.py +62 -12
  8. sqlspec/adapters/adbc/data_dictionary.py +52 -2
  9. sqlspec/adapters/adbc/driver.py +144 -45
  10. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  11. sqlspec/adapters/adbc/litestar/store.py +504 -0
  12. sqlspec/adapters/adbc/type_converter.py +44 -50
  13. sqlspec/adapters/aiosqlite/_types.py +1 -1
  14. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  15. sqlspec/adapters/aiosqlite/adk/store.py +527 -0
  16. sqlspec/adapters/aiosqlite/config.py +86 -16
  17. sqlspec/adapters/aiosqlite/data_dictionary.py +34 -2
  18. sqlspec/adapters/aiosqlite/driver.py +127 -38
  19. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  20. sqlspec/adapters/aiosqlite/litestar/store.py +281 -0
  21. sqlspec/adapters/aiosqlite/pool.py +7 -7
  22. sqlspec/adapters/asyncmy/__init__.py +7 -1
  23. sqlspec/adapters/asyncmy/_types.py +1 -1
  24. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  25. sqlspec/adapters/asyncmy/adk/store.py +493 -0
  26. sqlspec/adapters/asyncmy/config.py +59 -17
  27. sqlspec/adapters/asyncmy/data_dictionary.py +41 -2
  28. sqlspec/adapters/asyncmy/driver.py +293 -62
  29. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  30. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  31. sqlspec/adapters/asyncpg/__init__.py +2 -1
  32. sqlspec/adapters/asyncpg/_type_handlers.py +71 -0
  33. sqlspec/adapters/asyncpg/_types.py +11 -7
  34. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  35. sqlspec/adapters/asyncpg/adk/store.py +450 -0
  36. sqlspec/adapters/asyncpg/config.py +57 -36
  37. sqlspec/adapters/asyncpg/data_dictionary.py +41 -2
  38. sqlspec/adapters/asyncpg/driver.py +153 -23
  39. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  40. sqlspec/adapters/asyncpg/litestar/store.py +253 -0
  41. sqlspec/adapters/bigquery/_types.py +1 -1
  42. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  43. sqlspec/adapters/bigquery/adk/store.py +576 -0
  44. sqlspec/adapters/bigquery/config.py +25 -11
  45. sqlspec/adapters/bigquery/data_dictionary.py +42 -2
  46. sqlspec/adapters/bigquery/driver.py +352 -144
  47. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  48. sqlspec/adapters/bigquery/litestar/store.py +327 -0
  49. sqlspec/adapters/bigquery/type_converter.py +55 -23
  50. sqlspec/adapters/duckdb/_types.py +2 -2
  51. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  52. sqlspec/adapters/duckdb/adk/store.py +553 -0
  53. sqlspec/adapters/duckdb/config.py +79 -21
  54. sqlspec/adapters/duckdb/data_dictionary.py +41 -2
  55. sqlspec/adapters/duckdb/driver.py +138 -43
  56. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  57. sqlspec/adapters/duckdb/litestar/store.py +332 -0
  58. sqlspec/adapters/duckdb/pool.py +5 -5
  59. sqlspec/adapters/duckdb/type_converter.py +51 -21
  60. sqlspec/adapters/oracledb/_numpy_handlers.py +133 -0
  61. sqlspec/adapters/oracledb/_types.py +20 -2
  62. sqlspec/adapters/oracledb/adk/__init__.py +5 -0
  63. sqlspec/adapters/oracledb/adk/store.py +1745 -0
  64. sqlspec/adapters/oracledb/config.py +120 -36
  65. sqlspec/adapters/oracledb/data_dictionary.py +87 -20
  66. sqlspec/adapters/oracledb/driver.py +292 -84
  67. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  68. sqlspec/adapters/oracledb/litestar/store.py +767 -0
  69. sqlspec/adapters/oracledb/migrations.py +316 -25
  70. sqlspec/adapters/oracledb/type_converter.py +91 -16
  71. sqlspec/adapters/psqlpy/_type_handlers.py +44 -0
  72. sqlspec/adapters/psqlpy/_types.py +2 -1
  73. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  74. sqlspec/adapters/psqlpy/adk/store.py +482 -0
  75. sqlspec/adapters/psqlpy/config.py +45 -19
  76. sqlspec/adapters/psqlpy/data_dictionary.py +41 -2
  77. sqlspec/adapters/psqlpy/driver.py +101 -31
  78. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  79. sqlspec/adapters/psqlpy/litestar/store.py +272 -0
  80. sqlspec/adapters/psqlpy/type_converter.py +40 -11
  81. sqlspec/adapters/psycopg/_type_handlers.py +80 -0
  82. sqlspec/adapters/psycopg/_types.py +2 -1
  83. sqlspec/adapters/psycopg/adk/__init__.py +5 -0
  84. sqlspec/adapters/psycopg/adk/store.py +944 -0
  85. sqlspec/adapters/psycopg/config.py +65 -37
  86. sqlspec/adapters/psycopg/data_dictionary.py +77 -3
  87. sqlspec/adapters/psycopg/driver.py +200 -78
  88. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  89. sqlspec/adapters/psycopg/litestar/store.py +554 -0
  90. sqlspec/adapters/sqlite/__init__.py +2 -1
  91. sqlspec/adapters/sqlite/_type_handlers.py +86 -0
  92. sqlspec/adapters/sqlite/_types.py +1 -1
  93. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  94. sqlspec/adapters/sqlite/adk/store.py +572 -0
  95. sqlspec/adapters/sqlite/config.py +85 -16
  96. sqlspec/adapters/sqlite/data_dictionary.py +34 -2
  97. sqlspec/adapters/sqlite/driver.py +120 -52
  98. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  99. sqlspec/adapters/sqlite/litestar/store.py +318 -0
  100. sqlspec/adapters/sqlite/pool.py +5 -5
  101. sqlspec/base.py +45 -26
  102. sqlspec/builder/__init__.py +73 -4
  103. sqlspec/builder/_base.py +91 -58
  104. sqlspec/builder/_column.py +5 -5
  105. sqlspec/builder/_ddl.py +98 -89
  106. sqlspec/builder/_delete.py +5 -4
  107. sqlspec/builder/_dml.py +388 -0
  108. sqlspec/{_sql.py → builder/_factory.py} +41 -44
  109. sqlspec/builder/_insert.py +5 -82
  110. sqlspec/builder/{mixins/_join_operations.py → _join.py} +145 -143
  111. sqlspec/builder/_merge.py +446 -11
  112. sqlspec/builder/_parsing_utils.py +9 -11
  113. sqlspec/builder/_select.py +1313 -25
  114. sqlspec/builder/_update.py +11 -42
  115. sqlspec/cli.py +76 -69
  116. sqlspec/config.py +231 -60
  117. sqlspec/core/__init__.py +5 -4
  118. sqlspec/core/cache.py +18 -18
  119. sqlspec/core/compiler.py +6 -8
  120. sqlspec/core/filters.py +37 -37
  121. sqlspec/core/hashing.py +9 -9
  122. sqlspec/core/parameters.py +76 -45
  123. sqlspec/core/result.py +102 -46
  124. sqlspec/core/splitter.py +16 -17
  125. sqlspec/core/statement.py +32 -31
  126. sqlspec/core/type_conversion.py +3 -2
  127. sqlspec/driver/__init__.py +1 -3
  128. sqlspec/driver/_async.py +95 -161
  129. sqlspec/driver/_common.py +133 -80
  130. sqlspec/driver/_sync.py +95 -162
  131. sqlspec/driver/mixins/_result_tools.py +20 -236
  132. sqlspec/driver/mixins/_sql_translator.py +4 -4
  133. sqlspec/exceptions.py +70 -7
  134. sqlspec/extensions/adk/__init__.py +53 -0
  135. sqlspec/extensions/adk/_types.py +51 -0
  136. sqlspec/extensions/adk/converters.py +172 -0
  137. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +144 -0
  138. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  139. sqlspec/extensions/adk/service.py +181 -0
  140. sqlspec/extensions/adk/store.py +536 -0
  141. sqlspec/extensions/aiosql/adapter.py +73 -53
  142. sqlspec/extensions/litestar/__init__.py +21 -4
  143. sqlspec/extensions/litestar/cli.py +54 -10
  144. sqlspec/extensions/litestar/config.py +59 -266
  145. sqlspec/extensions/litestar/handlers.py +46 -17
  146. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  147. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  148. sqlspec/extensions/litestar/plugin.py +324 -223
  149. sqlspec/extensions/litestar/providers.py +25 -25
  150. sqlspec/extensions/litestar/store.py +265 -0
  151. sqlspec/loader.py +30 -49
  152. sqlspec/migrations/base.py +200 -76
  153. sqlspec/migrations/commands.py +591 -62
  154. sqlspec/migrations/context.py +6 -9
  155. sqlspec/migrations/fix.py +199 -0
  156. sqlspec/migrations/loaders.py +47 -19
  157. sqlspec/migrations/runner.py +241 -75
  158. sqlspec/migrations/tracker.py +237 -21
  159. sqlspec/migrations/utils.py +51 -3
  160. sqlspec/migrations/validation.py +177 -0
  161. sqlspec/protocols.py +66 -36
  162. sqlspec/storage/_utils.py +98 -0
  163. sqlspec/storage/backends/fsspec.py +134 -106
  164. sqlspec/storage/backends/local.py +78 -51
  165. sqlspec/storage/backends/obstore.py +278 -162
  166. sqlspec/storage/registry.py +75 -39
  167. sqlspec/typing.py +14 -84
  168. sqlspec/utils/config_resolver.py +6 -6
  169. sqlspec/utils/correlation.py +4 -5
  170. sqlspec/utils/data_transformation.py +3 -2
  171. sqlspec/utils/deprecation.py +9 -8
  172. sqlspec/utils/fixtures.py +4 -4
  173. sqlspec/utils/logging.py +46 -6
  174. sqlspec/utils/module_loader.py +2 -2
  175. sqlspec/utils/schema.py +288 -0
  176. sqlspec/utils/serializers.py +3 -3
  177. sqlspec/utils/sync_tools.py +21 -17
  178. sqlspec/utils/text.py +1 -2
  179. sqlspec/utils/type_guards.py +111 -20
  180. sqlspec/utils/version.py +433 -0
  181. {sqlspec-0.26.0.dist-info → sqlspec-0.27.0.dist-info}/METADATA +40 -21
  182. sqlspec-0.27.0.dist-info/RECORD +207 -0
  183. sqlspec/builder/mixins/__init__.py +0 -55
  184. sqlspec/builder/mixins/_cte_and_set_ops.py +0 -253
  185. sqlspec/builder/mixins/_delete_operations.py +0 -50
  186. sqlspec/builder/mixins/_insert_operations.py +0 -282
  187. sqlspec/builder/mixins/_merge_operations.py +0 -698
  188. sqlspec/builder/mixins/_order_limit_operations.py +0 -145
  189. sqlspec/builder/mixins/_pivot_operations.py +0 -157
  190. sqlspec/builder/mixins/_select_operations.py +0 -930
  191. sqlspec/builder/mixins/_update_operations.py +0 -199
  192. sqlspec/builder/mixins/_where_clause.py +0 -1298
  193. sqlspec-0.26.0.dist-info/RECORD +0 -157
  194. sqlspec-0.26.0.dist-info/licenses/NOTICE +0 -29
  195. {sqlspec-0.26.0.dist-info → sqlspec-0.27.0.dist-info}/WHEEL +0 -0
  196. {sqlspec-0.26.0.dist-info → sqlspec-0.27.0.dist-info}/entry_points.txt +0 -0
  197. {sqlspec-0.26.0.dist-info → sqlspec-0.27.0.dist-info}/licenses/LICENSE +0 -0
sqlspec/core/statement.py CHANGED
@@ -1,21 +1,22 @@
1
1
  """SQL statement and configuration management."""
2
2
 
3
- from typing import TYPE_CHECKING, Any, Callable, Final, Optional, Union
3
+ from typing import TYPE_CHECKING, Any, Final, Optional, TypeAlias
4
4
 
5
5
  import sqlglot
6
6
  from mypy_extensions import mypyc_attr
7
7
  from sqlglot import exp
8
8
  from sqlglot.errors import ParseError
9
- from typing_extensions import TypeAlias
10
9
 
10
+ import sqlspec.exceptions
11
11
  from sqlspec.core.compiler import OperationType, SQLProcessor
12
12
  from sqlspec.core.parameters import ParameterConverter, ParameterStyle, ParameterStyleConfig, ParameterValidator
13
- from sqlspec.exceptions import SQLSpecError
14
13
  from sqlspec.typing import Empty, EmptyEnum
15
14
  from sqlspec.utils.logging import get_logger
16
15
  from sqlspec.utils.type_guards import is_statement_filter, supports_where
17
16
 
18
17
  if TYPE_CHECKING:
18
+ from collections.abc import Callable
19
+
19
20
  from sqlglot.dialects.dialect import DialectType
20
21
 
21
22
  from sqlspec.core.cache import FiltersView
@@ -80,10 +81,10 @@ class ProcessedState:
80
81
  self,
81
82
  compiled_sql: str,
82
83
  execution_parameters: Any,
83
- parsed_expression: "Optional[exp.Expression]" = None,
84
+ parsed_expression: "exp.Expression | None" = None,
84
85
  operation_type: "OperationType" = "UNKNOWN",
85
- parameter_casts: "Optional[dict[int, str]]" = None,
86
- validation_errors: "Optional[list[str]]" = None,
86
+ parameter_casts: "dict[int, str] | None" = None,
87
+ validation_errors: "list[str] | None" = None,
87
88
  is_many: bool = False,
88
89
  ) -> None:
89
90
  self.compiled_sql = compiled_sql
@@ -123,10 +124,10 @@ class SQL:
123
124
 
124
125
  def __init__(
125
126
  self,
126
- statement: "Union[str, exp.Expression, 'SQL']",
127
- *parameters: "Union[Any, StatementFilter, list[Union[Any, StatementFilter]]]",
127
+ statement: "str | exp.Expression | 'SQL'",
128
+ *parameters: "Any | StatementFilter | list[Any | StatementFilter]",
128
129
  statement_config: Optional["StatementConfig"] = None,
129
- is_many: Optional[bool] = None,
130
+ is_many: bool | None = None,
130
131
  **kwargs: Any,
131
132
  ) -> None:
132
133
  """Initialize SQL statement.
@@ -141,8 +142,8 @@ class SQL:
141
142
  config = statement_config or self._create_auto_config(statement, parameters, kwargs)
142
143
  self._statement_config = config
143
144
  self._dialect = self._normalize_dialect(config.dialect)
144
- self._processed_state: Union[EmptyEnum, ProcessedState] = Empty
145
- self._hash: Optional[int] = None
145
+ self._processed_state: EmptyEnum | ProcessedState = Empty
146
+ self._hash: int | None = None
146
147
  self._filters: list[StatementFilter] = []
147
148
  self._named_parameters: dict[str, Any] = {}
148
149
  self._positional_parameters: list[Any] = []
@@ -165,7 +166,7 @@ class SQL:
165
166
  self._process_parameters(*parameters, **kwargs)
166
167
 
167
168
  def _create_auto_config(
168
- self, _statement: "Union[str, exp.Expression, 'SQL']", _parameters: tuple, _kwargs: dict[str, Any]
169
+ self, _statement: "str | exp.Expression | 'SQL'", _parameters: tuple, _kwargs: dict[str, Any]
169
170
  ) -> "StatementConfig":
170
171
  """Create default StatementConfig when none provided.
171
172
 
@@ -179,7 +180,7 @@ class SQL:
179
180
  """
180
181
  return get_default_config()
181
182
 
182
- def _normalize_dialect(self, dialect: "Optional[DialectType]") -> "Optional[str]":
183
+ def _normalize_dialect(self, dialect: "DialectType | None") -> "str | None":
183
184
  """Convert dialect to string representation.
184
185
 
185
186
  Args:
@@ -224,7 +225,7 @@ class SQL:
224
225
  return len(param_list) > 1
225
226
  return False
226
227
 
227
- def _process_parameters(self, *parameters: Any, dialect: Optional[str] = None, **kwargs: Any) -> None:
228
+ def _process_parameters(self, *parameters: Any, dialect: str | None = None, **kwargs: Any) -> None:
228
229
  """Process and organize parameters and filters.
229
230
 
230
231
  Args:
@@ -318,7 +319,7 @@ class SQL:
318
319
  return self._statement_config
319
320
 
320
321
  @property
321
- def expression(self) -> "Optional[exp.Expression]":
322
+ def expression(self) -> "exp.Expression | None":
322
323
  """SQLGlot expression."""
323
324
  if self._processed_state is not Empty:
324
325
  return self._processed_state.parsed_expression
@@ -349,17 +350,17 @@ class SQL:
349
350
  return self._processed_state
350
351
 
351
352
  @property
352
- def dialect(self) -> "Optional[str]":
353
+ def dialect(self) -> "str | None":
353
354
  """SQL dialect."""
354
355
  return self._dialect
355
356
 
356
357
  @property
357
- def _statement(self) -> "Optional[exp.Expression]":
358
+ def _statement(self) -> "exp.Expression | None":
358
359
  """Internal SQLGlot expression."""
359
360
  return self.expression
360
361
 
361
362
  @property
362
- def statement_expression(self) -> "Optional[exp.Expression]":
363
+ def statement_expression(self) -> "exp.Expression | None":
363
364
  """Get parsed statement expression (public API).
364
365
 
365
366
  Returns:
@@ -454,7 +455,7 @@ class SQL:
454
455
  validation_errors=[],
455
456
  is_many=self._is_many,
456
457
  )
457
- except SQLSpecError:
458
+ except sqlspec.exceptions.SQLSpecError:
458
459
  raise
459
460
  except Exception as e:
460
461
  logger.warning("Processing failed, using fallback: %s", e)
@@ -485,7 +486,7 @@ class SQL:
485
486
  return new_sql
486
487
 
487
488
  def copy(
488
- self, statement: "Optional[Union[str, exp.Expression]]" = None, parameters: Optional[Any] = None, **kwargs: Any
489
+ self, statement: "str | exp.Expression | None" = None, parameters: Any | None = None, **kwargs: Any
489
490
  ) -> "SQL":
490
491
  """Create copy with modifications.
491
492
 
@@ -530,7 +531,7 @@ class SQL:
530
531
  new_sql._filters = self._filters.copy()
531
532
  return new_sql
532
533
 
533
- def where(self, condition: "Union[str, exp.Expression]") -> "SQL":
534
+ def where(self, condition: "str | exp.Expression") -> "SQL":
534
535
  """Add WHERE condition to the SQL statement.
535
536
 
536
537
  Args:
@@ -623,7 +624,7 @@ class StatementConfig:
623
624
 
624
625
  def __init__(
625
626
  self,
626
- parameter_config: "Optional[ParameterStyleConfig]" = None,
627
+ parameter_config: "ParameterStyleConfig | None" = None,
627
628
  enable_parsing: bool = True,
628
629
  enable_validation: bool = True,
629
630
  enable_transformations: bool = True,
@@ -631,14 +632,14 @@ class StatementConfig:
631
632
  enable_expression_simplification: bool = False,
632
633
  enable_parameter_type_wrapping: bool = True,
633
634
  enable_caching: bool = True,
634
- parameter_converter: "Optional[ParameterConverter]" = None,
635
- parameter_validator: "Optional[ParameterValidator]" = None,
636
- dialect: "Optional[DialectType]" = None,
637
- pre_process_steps: "Optional[list[Any]]" = None,
638
- post_process_steps: "Optional[list[Any]]" = None,
639
- execution_mode: "Optional[str]" = None,
640
- execution_args: "Optional[dict[str, Any]]" = None,
641
- output_transformer: "Optional[Callable[[str, Any], tuple[str, Any]]]" = None,
635
+ parameter_converter: "ParameterConverter | None" = None,
636
+ parameter_validator: "ParameterValidator | None" = None,
637
+ dialect: "DialectType | None" = None,
638
+ pre_process_steps: "list[Any] | None" = None,
639
+ post_process_steps: "list[Any] | None" = None,
640
+ execution_mode: "str | None" = None,
641
+ execution_args: "dict[str, Any] | None" = None,
642
+ output_transformer: "Callable[[str, Any], tuple[str, Any]] | None" = None,
642
643
  ) -> None:
643
644
  """Initialize StatementConfig.
644
645
 
@@ -805,4 +806,4 @@ def get_default_parameter_config() -> ParameterStyleConfig:
805
806
  )
806
807
 
807
808
 
808
- Statement: TypeAlias = Union[str, exp.Expression, SQL]
809
+ Statement: TypeAlias = str | exp.Expression | SQL
@@ -5,9 +5,10 @@ adapters, with MyPyC-compatible optimizations.
5
5
  """
6
6
 
7
7
  import re
8
+ from collections.abc import Callable
8
9
  from datetime import date, datetime, time, timezone
9
10
  from decimal import Decimal
10
- from typing import Any, Callable, Final, Optional
11
+ from typing import Any, Final
11
12
  from uuid import UUID
12
13
 
13
14
  from sqlspec._serialization import decode_json
@@ -38,7 +39,7 @@ class BaseTypeConverter:
38
39
 
39
40
  __slots__ = ()
40
41
 
41
- def detect_type(self, value: str) -> Optional[str]:
42
+ def detect_type(self, value: str) -> str | None:
42
43
  """Detect special types from string values.
43
44
 
44
45
  Args:
@@ -1,7 +1,5 @@
1
1
  """Driver protocols and base classes for database adapters."""
2
2
 
3
- from typing import Union
4
-
5
3
  from sqlspec.driver import mixins
6
4
  from sqlspec.driver._async import AsyncDataDictionaryBase, AsyncDriverAdapterBase
7
5
  from sqlspec.driver._common import CommonDriverAttributesMixin, ExecutionResult, VersionInfo
@@ -19,4 +17,4 @@ __all__ = (
19
17
  "mixins",
20
18
  )
21
19
 
22
- DriverAdapterProtocol = Union[SyncDriverAdapterBase, AsyncDriverAdapterBase]
20
+ DriverAdapterProtocol = SyncDriverAdapterBase | AsyncDriverAdapterBase