sqlspec 0.26.0__py3-none-any.whl → 0.28.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 (212) hide show
  1. sqlspec/__init__.py +7 -15
  2. sqlspec/_serialization.py +55 -25
  3. sqlspec/_typing.py +155 -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 +880 -0
  7. sqlspec/adapters/adbc/config.py +62 -12
  8. sqlspec/adapters/adbc/data_dictionary.py +74 -2
  9. sqlspec/adapters/adbc/driver.py +226 -58
  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 +536 -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 +503 -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 +460 -0
  36. sqlspec/adapters/asyncpg/config.py +57 -36
  37. sqlspec/adapters/asyncpg/data_dictionary.py +48 -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 +585 -0
  44. sqlspec/adapters/bigquery/config.py +36 -11
  45. sqlspec/adapters/bigquery/data_dictionary.py +42 -2
  46. sqlspec/adapters/bigquery/driver.py +489 -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 +563 -0
  53. sqlspec/adapters/duckdb/config.py +79 -21
  54. sqlspec/adapters/duckdb/data_dictionary.py +41 -2
  55. sqlspec/adapters/duckdb/driver.py +225 -44
  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 +1628 -0
  64. sqlspec/adapters/oracledb/config.py +120 -36
  65. sqlspec/adapters/oracledb/data_dictionary.py +87 -20
  66. sqlspec/adapters/oracledb/driver.py +475 -86
  67. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  68. sqlspec/adapters/oracledb/litestar/store.py +765 -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 +483 -0
  75. sqlspec/adapters/psqlpy/config.py +45 -19
  76. sqlspec/adapters/psqlpy/data_dictionary.py +48 -2
  77. sqlspec/adapters/psqlpy/driver.py +108 -41
  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 +962 -0
  85. sqlspec/adapters/psycopg/config.py +65 -37
  86. sqlspec/adapters/psycopg/data_dictionary.py +91 -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 +582 -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 +331 -62
  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 +55 -47
  121. sqlspec/core/hashing.py +9 -9
  122. sqlspec/core/parameters.py +76 -45
  123. sqlspec/core/result.py +234 -47
  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 +183 -160
  129. sqlspec/driver/_common.py +197 -109
  130. sqlspec/driver/_sync.py +189 -161
  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 +69 -61
  142. sqlspec/extensions/fastapi/__init__.py +21 -0
  143. sqlspec/extensions/fastapi/extension.py +331 -0
  144. sqlspec/extensions/fastapi/providers.py +543 -0
  145. sqlspec/extensions/flask/__init__.py +36 -0
  146. sqlspec/extensions/flask/_state.py +71 -0
  147. sqlspec/extensions/flask/_utils.py +40 -0
  148. sqlspec/extensions/flask/extension.py +389 -0
  149. sqlspec/extensions/litestar/__init__.py +21 -4
  150. sqlspec/extensions/litestar/cli.py +54 -10
  151. sqlspec/extensions/litestar/config.py +56 -266
  152. sqlspec/extensions/litestar/handlers.py +46 -17
  153. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  154. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  155. sqlspec/extensions/litestar/plugin.py +349 -224
  156. sqlspec/extensions/litestar/providers.py +25 -25
  157. sqlspec/extensions/litestar/store.py +265 -0
  158. sqlspec/extensions/starlette/__init__.py +10 -0
  159. sqlspec/extensions/starlette/_state.py +25 -0
  160. sqlspec/extensions/starlette/_utils.py +52 -0
  161. sqlspec/extensions/starlette/extension.py +254 -0
  162. sqlspec/extensions/starlette/middleware.py +154 -0
  163. sqlspec/loader.py +30 -49
  164. sqlspec/migrations/base.py +200 -76
  165. sqlspec/migrations/commands.py +591 -62
  166. sqlspec/migrations/context.py +6 -9
  167. sqlspec/migrations/fix.py +199 -0
  168. sqlspec/migrations/loaders.py +47 -19
  169. sqlspec/migrations/runner.py +241 -75
  170. sqlspec/migrations/tracker.py +237 -21
  171. sqlspec/migrations/utils.py +51 -3
  172. sqlspec/migrations/validation.py +177 -0
  173. sqlspec/protocols.py +106 -36
  174. sqlspec/storage/_utils.py +85 -0
  175. sqlspec/storage/backends/fsspec.py +133 -107
  176. sqlspec/storage/backends/local.py +78 -51
  177. sqlspec/storage/backends/obstore.py +276 -168
  178. sqlspec/storage/registry.py +75 -39
  179. sqlspec/typing.py +30 -84
  180. sqlspec/utils/__init__.py +25 -4
  181. sqlspec/utils/arrow_helpers.py +81 -0
  182. sqlspec/utils/config_resolver.py +6 -6
  183. sqlspec/utils/correlation.py +4 -5
  184. sqlspec/utils/data_transformation.py +3 -2
  185. sqlspec/utils/deprecation.py +9 -8
  186. sqlspec/utils/fixtures.py +4 -4
  187. sqlspec/utils/logging.py +46 -6
  188. sqlspec/utils/module_loader.py +205 -5
  189. sqlspec/utils/portal.py +311 -0
  190. sqlspec/utils/schema.py +288 -0
  191. sqlspec/utils/serializers.py +113 -4
  192. sqlspec/utils/sync_tools.py +36 -22
  193. sqlspec/utils/text.py +1 -2
  194. sqlspec/utils/type_guards.py +136 -20
  195. sqlspec/utils/version.py +433 -0
  196. {sqlspec-0.26.0.dist-info → sqlspec-0.28.0.dist-info}/METADATA +41 -22
  197. sqlspec-0.28.0.dist-info/RECORD +221 -0
  198. sqlspec/builder/mixins/__init__.py +0 -55
  199. sqlspec/builder/mixins/_cte_and_set_ops.py +0 -253
  200. sqlspec/builder/mixins/_delete_operations.py +0 -50
  201. sqlspec/builder/mixins/_insert_operations.py +0 -282
  202. sqlspec/builder/mixins/_merge_operations.py +0 -698
  203. sqlspec/builder/mixins/_order_limit_operations.py +0 -145
  204. sqlspec/builder/mixins/_pivot_operations.py +0 -157
  205. sqlspec/builder/mixins/_select_operations.py +0 -930
  206. sqlspec/builder/mixins/_update_operations.py +0 -199
  207. sqlspec/builder/mixins/_where_clause.py +0 -1298
  208. sqlspec-0.26.0.dist-info/RECORD +0 -157
  209. sqlspec-0.26.0.dist-info/licenses/NOTICE +0 -29
  210. {sqlspec-0.26.0.dist-info → sqlspec-0.28.0.dist-info}/WHEEL +0 -0
  211. {sqlspec-0.26.0.dist-info → sqlspec-0.28.0.dist-info}/entry_points.txt +0 -0
  212. {sqlspec-0.26.0.dist-info → sqlspec-0.28.0.dist-info}/licenses/LICENSE +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  import contextlib
4
4
  import logging
5
- from typing import TYPE_CHECKING, Any, Callable, ClassVar, Optional, TypedDict, Union
5
+ from typing import TYPE_CHECKING, Any, ClassVar, TypedDict
6
6
 
7
7
  from google.cloud.bigquery import LoadJobConfig, QueryJobConfig
8
8
  from typing_extensions import NotRequired
@@ -14,7 +14,7 @@ from sqlspec.exceptions import ImproperConfigurationError
14
14
  from sqlspec.typing import Empty
15
15
 
16
16
  if TYPE_CHECKING:
17
- from collections.abc import Generator
17
+ from collections.abc import Callable, Generator
18
18
 
19
19
  from google.api_core.client_info import ClientInfo
20
20
  from google.api_core.client_options import ClientOptions
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
26
26
  logger = logging.getLogger(__name__)
27
27
 
28
28
 
29
- class BigQueryConnectionParams(TypedDict, total=False):
29
+ class BigQueryConnectionParams(TypedDict):
30
30
  """Standard BigQuery connection parameters.
31
31
 
32
32
  Includes both official BigQuery client parameters and BigQuery-specific configuration options.
@@ -63,16 +63,29 @@ class BigQueryConnectionParams(TypedDict, total=False):
63
63
  extra: NotRequired[dict[str, Any]]
64
64
 
65
65
 
66
- class BigQueryDriverFeatures(TypedDict, total=False):
66
+ class BigQueryDriverFeatures(TypedDict):
67
67
  """BigQuery driver-specific features configuration.
68
68
 
69
69
  Only non-standard BigQuery client parameters that are SQLSpec-specific extensions.
70
+
71
+ Attributes:
72
+ connection_instance: Pre-existing BigQuery connection instance to use.
73
+ on_job_start: Callback invoked when a query job starts.
74
+ on_job_complete: Callback invoked when a query job completes.
75
+ on_connection_create: Callback invoked when connection is created.
76
+ json_serializer: Custom JSON serializer for dict/list parameter conversion.
77
+ Defaults to sqlspec.utils.serializers.to_json if not provided.
78
+ enable_uuid_conversion: Enable automatic UUID string conversion.
79
+ When True (default), UUID strings are automatically converted to UUID objects.
80
+ When False, UUID strings are treated as regular strings.
70
81
  """
71
82
 
72
83
  connection_instance: NotRequired["BigQueryConnection"]
73
84
  on_job_start: NotRequired["Callable[[str], None]"]
74
85
  on_job_complete: NotRequired["Callable[[str, Any], None]"]
75
86
  on_connection_create: NotRequired["Callable[[Any], None]"]
87
+ json_serializer: NotRequired["Callable[[Any], str]"]
88
+ enable_uuid_conversion: NotRequired[bool]
76
89
 
77
90
 
78
91
  __all__ = ("BigQueryConfig", "BigQueryConnectionParams", "BigQueryDriverFeatures")
@@ -86,15 +99,17 @@ class BigQueryConfig(NoPoolSyncConfig[BigQueryConnection, BigQueryDriver]):
86
99
 
87
100
  driver_type: ClassVar[type[BigQueryDriver]] = BigQueryDriver
88
101
  connection_type: "ClassVar[type[BigQueryConnection]]" = BigQueryConnection
102
+ supports_transactional_ddl: ClassVar[bool] = False
89
103
 
90
104
  def __init__(
91
105
  self,
92
106
  *,
93
- connection_config: "Optional[Union[BigQueryConnectionParams, dict[str, Any]]]" = None,
94
- migration_config: Optional[dict[str, Any]] = None,
95
- statement_config: "Optional[StatementConfig]" = None,
96
- driver_features: "Optional[Union[BigQueryDriverFeatures, dict[str, Any]]]" = None,
97
- bind_key: "Optional[str]" = None,
107
+ connection_config: "BigQueryConnectionParams | dict[str, Any] | None" = None,
108
+ migration_config: dict[str, Any] | None = None,
109
+ statement_config: "StatementConfig | None" = None,
110
+ driver_features: "BigQueryDriverFeatures | dict[str, Any] | None" = None,
111
+ bind_key: "str | None" = None,
112
+ extension_config: "dict[str, dict[str, Any]] | None" = None,
98
113
  ) -> None:
99
114
  """Initialize BigQuery configuration.
100
115
 
@@ -104,6 +119,7 @@ class BigQueryConfig(NoPoolSyncConfig[BigQueryConnection, BigQueryDriver]):
104
119
  statement_config: Statement configuration override
105
120
  driver_features: BigQuery-specific driver features
106
121
  bind_key: Optional unique identifier for this configuration
122
+ extension_config: Extension-specific configuration (e.g., Litestar plugin settings)
107
123
  """
108
124
 
109
125
  self.connection_config: dict[str, Any] = dict(connection_config) if connection_config else {}
@@ -113,7 +129,15 @@ class BigQueryConfig(NoPoolSyncConfig[BigQueryConnection, BigQueryDriver]):
113
129
 
114
130
  self.driver_features: dict[str, Any] = dict(driver_features) if driver_features else {}
115
131
 
116
- self._connection_instance: Optional[BigQueryConnection] = self.driver_features.get("connection_instance")
132
+ if "enable_uuid_conversion" not in self.driver_features:
133
+ self.driver_features["enable_uuid_conversion"] = True
134
+
135
+ if "json_serializer" not in self.driver_features:
136
+ from sqlspec.utils.serializers import to_json
137
+
138
+ self.driver_features["json_serializer"] = to_json
139
+
140
+ self._connection_instance: BigQueryConnection | None = self.driver_features.get("connection_instance")
117
141
 
118
142
  if "default_query_job_config" not in self.connection_config:
119
143
  self._setup_default_job_config()
@@ -127,6 +151,7 @@ class BigQueryConfig(NoPoolSyncConfig[BigQueryConnection, BigQueryDriver]):
127
151
  statement_config=statement_config,
128
152
  driver_features=self.driver_features,
129
153
  bind_key=bind_key,
154
+ extension_config=extension_config,
130
155
  )
131
156
 
132
157
  def _setup_default_job_config(self) -> None:
@@ -215,7 +240,7 @@ class BigQueryConfig(NoPoolSyncConfig[BigQueryConnection, BigQueryDriver]):
215
240
 
216
241
  @contextlib.contextmanager
217
242
  def provide_session(
218
- self, *_args: Any, statement_config: "Optional[StatementConfig]" = None, **_kwargs: Any
243
+ self, *_args: Any, statement_config: "StatementConfig | None" = None, **_kwargs: Any
219
244
  ) -> "Generator[BigQueryDriver, None, None]":
220
245
  """Provide a BigQuery driver session context manager.
221
246
 
@@ -1,10 +1,13 @@
1
1
  """BigQuery-specific data dictionary for metadata queries."""
2
2
 
3
- from typing import Optional
3
+ from typing import TYPE_CHECKING, Any, cast
4
4
 
5
5
  from sqlspec.driver import SyncDataDictionaryBase, SyncDriverAdapterBase, VersionInfo
6
6
  from sqlspec.utils.logging import get_logger
7
7
 
8
+ if TYPE_CHECKING:
9
+ from sqlspec.adapters.bigquery.driver import BigQueryDriver
10
+
8
11
  logger = get_logger("adapters.bigquery.data_dictionary")
9
12
 
10
13
  __all__ = ("BigQuerySyncDataDictionary",)
@@ -13,7 +16,7 @@ __all__ = ("BigQuerySyncDataDictionary",)
13
16
  class BigQuerySyncDataDictionary(SyncDataDictionaryBase):
14
17
  """BigQuery-specific sync data dictionary."""
15
18
 
16
- def get_version(self, driver: SyncDriverAdapterBase) -> "Optional[VersionInfo]":
19
+ def get_version(self, driver: SyncDriverAdapterBase) -> "VersionInfo | None":
17
20
  """Get BigQuery version information.
18
21
 
19
22
  BigQuery is a cloud service without traditional versioning.
@@ -85,6 +88,43 @@ class BigQuerySyncDataDictionary(SyncDataDictionaryBase):
85
88
  }
86
89
  return type_map.get(type_category, "STRING")
87
90
 
91
+ def get_columns(
92
+ self, driver: SyncDriverAdapterBase, table: str, schema: "str | None" = None
93
+ ) -> "list[dict[str, Any]]":
94
+ """Get column information for a table using INFORMATION_SCHEMA.
95
+
96
+ Args:
97
+ driver: BigQuery driver instance
98
+ table: Table name to query columns for
99
+ schema: Schema name (dataset name in BigQuery)
100
+
101
+ Returns:
102
+ List of column metadata dictionaries with keys:
103
+ - column_name: Name of the column
104
+ - data_type: BigQuery data type
105
+ - is_nullable: Whether column allows NULL (YES/NO)
106
+ - column_default: Default value if any
107
+ """
108
+ bigquery_driver = cast("BigQueryDriver", driver)
109
+
110
+ if schema:
111
+ sql = f"""
112
+ SELECT column_name, data_type, is_nullable, column_default
113
+ FROM `{schema}.INFORMATION_SCHEMA.COLUMNS`
114
+ WHERE table_name = '{table}'
115
+ ORDER BY ordinal_position
116
+ """
117
+ else:
118
+ sql = f"""
119
+ SELECT column_name, data_type, is_nullable, column_default
120
+ FROM INFORMATION_SCHEMA.COLUMNS
121
+ WHERE table_name = '{table}'
122
+ ORDER BY ordinal_position
123
+ """
124
+
125
+ result = bigquery_driver.execute(sql)
126
+ return result.data or []
127
+
88
128
  def list_available_features(self) -> "list[str]":
89
129
  """List available BigQuery feature flags.
90
130