sqlspec 0.9.0__py3-none-any.whl → 0.10.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 +2 -1
- sqlspec/adapters/adbc/__init__.py +2 -1
- sqlspec/adapters/adbc/config.py +7 -13
- sqlspec/adapters/adbc/driver.py +160 -21
- sqlspec/adapters/aiosqlite/__init__.py +2 -1
- sqlspec/adapters/aiosqlite/config.py +10 -12
- sqlspec/adapters/aiosqlite/driver.py +160 -22
- sqlspec/adapters/asyncmy/__init__.py +2 -1
- sqlspec/adapters/asyncmy/driver.py +158 -22
- sqlspec/adapters/asyncpg/config.py +1 -3
- sqlspec/adapters/asyncpg/driver.py +143 -5
- sqlspec/adapters/bigquery/__init__.py +4 -0
- sqlspec/adapters/bigquery/config/__init__.py +3 -0
- sqlspec/adapters/bigquery/config/_common.py +40 -0
- sqlspec/adapters/bigquery/config/_sync.py +87 -0
- sqlspec/adapters/bigquery/driver.py +701 -0
- sqlspec/adapters/duckdb/__init__.py +2 -1
- sqlspec/adapters/duckdb/config.py +17 -18
- sqlspec/adapters/duckdb/driver.py +165 -27
- sqlspec/adapters/oracledb/__init__.py +8 -1
- sqlspec/adapters/oracledb/config/_asyncio.py +7 -8
- sqlspec/adapters/oracledb/config/_sync.py +6 -7
- sqlspec/adapters/oracledb/driver.py +311 -42
- sqlspec/adapters/psqlpy/__init__.py +9 -0
- sqlspec/adapters/psqlpy/config.py +11 -19
- sqlspec/adapters/psqlpy/driver.py +171 -19
- sqlspec/adapters/psycopg/__init__.py +8 -1
- sqlspec/adapters/psycopg/config/__init__.py +10 -0
- sqlspec/adapters/psycopg/config/_async.py +6 -7
- sqlspec/adapters/psycopg/config/_sync.py +7 -8
- sqlspec/adapters/psycopg/driver.py +344 -86
- sqlspec/adapters/sqlite/__init__.py +2 -1
- sqlspec/adapters/sqlite/config.py +12 -11
- sqlspec/adapters/sqlite/driver.py +160 -51
- sqlspec/base.py +402 -63
- sqlspec/exceptions.py +9 -0
- sqlspec/extensions/litestar/config.py +3 -11
- sqlspec/extensions/litestar/handlers.py +2 -1
- sqlspec/extensions/litestar/plugin.py +6 -2
- sqlspec/mixins.py +156 -0
- sqlspec/typing.py +19 -1
- {sqlspec-0.9.0.dist-info → sqlspec-0.10.0.dist-info}/METADATA +147 -3
- sqlspec-0.10.0.dist-info/RECORD +67 -0
- sqlspec-0.9.0.dist-info/RECORD +0 -61
- {sqlspec-0.9.0.dist-info → sqlspec-0.10.0.dist-info}/WHEEL +0 -0
- {sqlspec-0.9.0.dist-info → sqlspec-0.10.0.dist-info}/licenses/LICENSE +0 -0
- {sqlspec-0.9.0.dist-info → sqlspec-0.10.0.dist-info}/licenses/NOTICE +0 -0
|
@@ -19,7 +19,8 @@ if TYPE_CHECKING:
|
|
|
19
19
|
from litestar.datastructures.state import State
|
|
20
20
|
from litestar.types import Message, Scope
|
|
21
21
|
|
|
22
|
-
from sqlspec.base import
|
|
22
|
+
from sqlspec.base import DatabaseConfigProtocol, DriverT
|
|
23
|
+
from sqlspec.typing import ConnectionT, PoolT
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
SESSION_TERMINUS_ASGI_EVENTS = {HTTP_RESPONSE_START, HTTP_DISCONNECT, WEBSOCKET_DISCONNECT, WEBSOCKET_CLOSE}
|
|
@@ -5,14 +5,14 @@ from litestar.plugins import InitPluginProtocol
|
|
|
5
5
|
|
|
6
6
|
from sqlspec.base import (
|
|
7
7
|
AsyncConfigT,
|
|
8
|
-
ConnectionT,
|
|
9
8
|
DatabaseConfigProtocol,
|
|
10
|
-
|
|
9
|
+
DriverT,
|
|
11
10
|
SyncConfigT,
|
|
12
11
|
)
|
|
13
12
|
from sqlspec.base import SQLSpec as SQLSpecBase
|
|
14
13
|
from sqlspec.exceptions import ImproperConfigurationError
|
|
15
14
|
from sqlspec.extensions.litestar.config import DatabaseConfig
|
|
15
|
+
from sqlspec.typing import ConnectionT, PoolT
|
|
16
16
|
|
|
17
17
|
if TYPE_CHECKING:
|
|
18
18
|
from click import Group
|
|
@@ -75,6 +75,7 @@ class SQLSpec(InitPluginProtocol, SQLSpecBase):
|
|
|
75
75
|
SQLSpec,
|
|
76
76
|
ConnectionT,
|
|
77
77
|
PoolT,
|
|
78
|
+
DriverT,
|
|
78
79
|
DatabaseConfig,
|
|
79
80
|
DatabaseConfigProtocol,
|
|
80
81
|
SyncConfigT,
|
|
@@ -83,6 +84,9 @@ class SQLSpec(InitPluginProtocol, SQLSpecBase):
|
|
|
83
84
|
)
|
|
84
85
|
for c in self._plugin_configs:
|
|
85
86
|
c.annotation = self.add_config(c.config)
|
|
87
|
+
app_config.signature_types.append(c.annotation)
|
|
88
|
+
app_config.signature_types.append(c.config.connection_type) # type: ignore[union-attr]
|
|
89
|
+
app_config.signature_types.append(c.config.driver_type) # type: ignore[union-attr]
|
|
86
90
|
app_config.before_send.append(c.before_send_handler)
|
|
87
91
|
app_config.lifespan.append(c.lifespan_handler) # pyright: ignore[reportUnknownMemberType]
|
|
88
92
|
app_config.dependencies.update(
|
sqlspec/mixins.py
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from typing import (
|
|
3
|
+
TYPE_CHECKING,
|
|
4
|
+
Any,
|
|
5
|
+
ClassVar,
|
|
6
|
+
Generic,
|
|
7
|
+
Optional,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
from sqlglot import parse_one
|
|
11
|
+
from sqlglot.dialects.dialect import DialectType
|
|
12
|
+
|
|
13
|
+
from sqlspec.exceptions import SQLConversionError, SQLParsingError
|
|
14
|
+
from sqlspec.typing import ConnectionT, StatementParameterType
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from sqlspec.typing import ArrowTable
|
|
18
|
+
|
|
19
|
+
__all__ = (
|
|
20
|
+
"AsyncArrowBulkOperationsMixin",
|
|
21
|
+
"AsyncParquetExportMixin",
|
|
22
|
+
"SQLTranslatorMixin",
|
|
23
|
+
"SyncArrowBulkOperationsMixin",
|
|
24
|
+
"SyncParquetExportMixin",
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class SyncArrowBulkOperationsMixin(Generic[ConnectionT]):
|
|
29
|
+
"""Mixin for sync drivers supporting bulk Apache Arrow operations."""
|
|
30
|
+
|
|
31
|
+
__supports_arrow__: "ClassVar[bool]" = True
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def select_arrow( # pyright: ignore[reportUnknownParameterType]
|
|
35
|
+
self,
|
|
36
|
+
sql: str,
|
|
37
|
+
parameters: "Optional[StatementParameterType]" = None,
|
|
38
|
+
/,
|
|
39
|
+
*,
|
|
40
|
+
connection: "Optional[ConnectionT]" = None,
|
|
41
|
+
**kwargs: Any,
|
|
42
|
+
) -> "ArrowTable": # pyright: ignore[reportUnknownReturnType]
|
|
43
|
+
"""Execute a SQL query and return results as an Apache Arrow Table.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
sql: The SQL query string.
|
|
47
|
+
parameters: Parameters for the query.
|
|
48
|
+
connection: Optional connection override.
|
|
49
|
+
**kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
An Apache Arrow Table containing the query results.
|
|
53
|
+
"""
|
|
54
|
+
raise NotImplementedError
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class AsyncArrowBulkOperationsMixin(Generic[ConnectionT]):
|
|
58
|
+
"""Mixin for async drivers supporting bulk Apache Arrow operations."""
|
|
59
|
+
|
|
60
|
+
__supports_arrow__: "ClassVar[bool]" = True
|
|
61
|
+
|
|
62
|
+
@abstractmethod
|
|
63
|
+
async def select_arrow( # pyright: ignore[reportUnknownParameterType]
|
|
64
|
+
self,
|
|
65
|
+
sql: str,
|
|
66
|
+
parameters: "Optional[StatementParameterType]" = None,
|
|
67
|
+
/,
|
|
68
|
+
*,
|
|
69
|
+
connection: "Optional[ConnectionT]" = None,
|
|
70
|
+
**kwargs: Any,
|
|
71
|
+
) -> "ArrowTable": # pyright: ignore[reportUnknownReturnType]
|
|
72
|
+
"""Execute a SQL query and return results as an Apache Arrow Table.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
sql: The SQL query string.
|
|
76
|
+
parameters: Parameters for the query.
|
|
77
|
+
connection: Optional connection override.
|
|
78
|
+
**kwargs: Additional keyword arguments to merge with parameters if parameters is a dict.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
An Apache Arrow Table containing the query results.
|
|
82
|
+
"""
|
|
83
|
+
raise NotImplementedError
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class SyncParquetExportMixin(Generic[ConnectionT]):
|
|
87
|
+
"""Mixin for sync drivers supporting Parquet export."""
|
|
88
|
+
|
|
89
|
+
@abstractmethod
|
|
90
|
+
def select_to_parquet(
|
|
91
|
+
self,
|
|
92
|
+
sql: str,
|
|
93
|
+
parameters: "Optional[StatementParameterType]" = None,
|
|
94
|
+
/,
|
|
95
|
+
*,
|
|
96
|
+
connection: "Optional[ConnectionT]" = None,
|
|
97
|
+
**kwargs: Any,
|
|
98
|
+
) -> None:
|
|
99
|
+
"""Export a SQL query to a Parquet file."""
|
|
100
|
+
raise NotImplementedError
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class AsyncParquetExportMixin(Generic[ConnectionT]):
|
|
104
|
+
"""Mixin for async drivers supporting Parquet export."""
|
|
105
|
+
|
|
106
|
+
@abstractmethod
|
|
107
|
+
async def select_to_parquet(
|
|
108
|
+
self,
|
|
109
|
+
sql: str,
|
|
110
|
+
parameters: "Optional[StatementParameterType]" = None,
|
|
111
|
+
/,
|
|
112
|
+
*,
|
|
113
|
+
connection: "Optional[ConnectionT]" = None,
|
|
114
|
+
**kwargs: Any,
|
|
115
|
+
) -> None:
|
|
116
|
+
"""Export a SQL query to a Parquet file."""
|
|
117
|
+
raise NotImplementedError
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class SQLTranslatorMixin(Generic[ConnectionT]):
|
|
121
|
+
"""Mixin for drivers supporting SQL translation."""
|
|
122
|
+
|
|
123
|
+
dialect: str
|
|
124
|
+
|
|
125
|
+
def convert_to_dialect(
|
|
126
|
+
self,
|
|
127
|
+
sql: str,
|
|
128
|
+
to_dialect: DialectType = None,
|
|
129
|
+
pretty: bool = True,
|
|
130
|
+
) -> str:
|
|
131
|
+
"""Convert a SQL query to a different dialect.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
sql: The SQL query string to convert.
|
|
135
|
+
to_dialect: The target dialect to convert to.
|
|
136
|
+
pretty: Whether to pretty-print the SQL query.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
The converted SQL query string.
|
|
140
|
+
|
|
141
|
+
Raises:
|
|
142
|
+
SQLParsingError: If the SQL query cannot be parsed.
|
|
143
|
+
SQLConversionError: If the SQL query cannot be converted to the target dialect.
|
|
144
|
+
"""
|
|
145
|
+
try:
|
|
146
|
+
parsed = parse_one(sql, dialect=self.dialect)
|
|
147
|
+
except Exception as e:
|
|
148
|
+
error_msg = f"Failed to parse SQL: {e!s}"
|
|
149
|
+
raise SQLParsingError(error_msg) from e
|
|
150
|
+
if to_dialect is None:
|
|
151
|
+
to_dialect = self.dialect
|
|
152
|
+
try:
|
|
153
|
+
return parsed.sql(dialect=to_dialect, pretty=pretty)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
error_msg = f"Failed to convert SQL to {to_dialect}: {e!s}"
|
|
156
|
+
raise SQLConversionError(error_msg) from e
|
sqlspec/typing.py
CHANGED
|
@@ -33,8 +33,26 @@ PYDANTIC_USE_FAILFAST = False # leave permanently disabled for now
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
T = TypeVar("T")
|
|
36
|
+
ConnectionT = TypeVar("ConnectionT")
|
|
37
|
+
"""Type variable for connection types.
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
:class:`~sqlspec.typing.ConnectionT`
|
|
40
|
+
"""
|
|
41
|
+
PoolT = TypeVar("PoolT")
|
|
42
|
+
"""Type variable for pool types.
|
|
43
|
+
|
|
44
|
+
:class:`~sqlspec.typing.PoolT`
|
|
45
|
+
"""
|
|
46
|
+
PoolT_co = TypeVar("PoolT_co", covariant=True)
|
|
47
|
+
"""Type variable for covariant pool types.
|
|
48
|
+
|
|
49
|
+
:class:`~sqlspec.typing.PoolT_co`
|
|
50
|
+
"""
|
|
51
|
+
ModelT = TypeVar("ModelT", bound="Union[dict[str, Any], Struct, BaseModel, DataclassProtocol]")
|
|
52
|
+
"""Type variable for model types.
|
|
53
|
+
|
|
54
|
+
:class:`dict[str, Any]` | :class:`msgspec.Struct` | :class:`pydantic.BaseModel` | :class:`DataclassProtocol`
|
|
55
|
+
"""
|
|
38
56
|
|
|
39
57
|
FilterTypeT = TypeVar("FilterTypeT", bound="StatementFilter")
|
|
40
58
|
"""Type variable for filter types.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlspec
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
4
4
|
Summary: SQL Experiments in Python
|
|
5
5
|
Author-email: Cody Fincher <cody@litestar.dev>
|
|
6
6
|
Maintainer-email: Litestar Developers <hello@litestar.dev>
|
|
@@ -41,6 +41,7 @@ Requires-Dist: oracledb; extra == 'oracledb'
|
|
|
41
41
|
Provides-Extra: orjson
|
|
42
42
|
Requires-Dist: orjson; extra == 'orjson'
|
|
43
43
|
Provides-Extra: performance
|
|
44
|
+
Requires-Dist: msgspec; extra == 'performance'
|
|
44
45
|
Requires-Dist: sqlglot[rs]; extra == 'performance'
|
|
45
46
|
Provides-Extra: psqlpy
|
|
46
47
|
Requires-Dist: psqlpy; extra == 'psqlpy'
|
|
@@ -83,6 +84,149 @@ SQLSpec is an experimental Python library designed to streamline and modernize y
|
|
|
83
84
|
|
|
84
85
|
SQLSpec is a work in progress. While it offers a solid foundation for modern SQL interactions, it does not yet include every feature you might find in a mature ORM or database toolkit. The focus is on building a robust, flexible core that can be extended over time.
|
|
85
86
|
|
|
87
|
+
## Examples
|
|
88
|
+
|
|
89
|
+
We've talked about what SQLSpec is not, so let's look at what it can do.
|
|
90
|
+
|
|
91
|
+
These are just a few of the examples that demonstrate SQLSpec's flexibility and each of the bundled adapters offer the same config and driver interfaces.
|
|
92
|
+
|
|
93
|
+
### DuckDB LLM
|
|
94
|
+
|
|
95
|
+
This is a quick implementation using some of the built in Secret and Extension management features of SQLSpec's DuckDB integration.
|
|
96
|
+
|
|
97
|
+
It allows you to communicate with any compatible OpenAPI conversations endpoint (such as Ollama). This examples:
|
|
98
|
+
|
|
99
|
+
- auto installs the `open_prompt` DuckDB extensions
|
|
100
|
+
- automatically creates the correct `open_prompt` comptaible secret required to use the extension
|
|
101
|
+
|
|
102
|
+
```py
|
|
103
|
+
# /// script
|
|
104
|
+
# dependencies = [
|
|
105
|
+
# "sqlspec[duckdb,performance]",
|
|
106
|
+
# ]
|
|
107
|
+
# ///
|
|
108
|
+
import os
|
|
109
|
+
|
|
110
|
+
from sqlspec import SQLSpec
|
|
111
|
+
from sqlspec.adapters.duckdb import DuckDBConfig
|
|
112
|
+
from pydantic import BaseModel
|
|
113
|
+
|
|
114
|
+
class ChatMessage(BaseModel):
|
|
115
|
+
message: str
|
|
116
|
+
|
|
117
|
+
sql = SQLSpec()
|
|
118
|
+
etl_config = sql.add_config(
|
|
119
|
+
DuckDBConfig(
|
|
120
|
+
extensions=[{"name": "open_prompt"}],
|
|
121
|
+
secrets=[
|
|
122
|
+
{
|
|
123
|
+
"secret_type": "open_prompt",
|
|
124
|
+
"name": "open_prompt",
|
|
125
|
+
"value": {
|
|
126
|
+
"api_url": "http://127.0.0.1:11434/v1/chat/completions",
|
|
127
|
+
"model_name": "gemma3:1b",
|
|
128
|
+
"api_timeout": "120",
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
)
|
|
133
|
+
)
|
|
134
|
+
with sql.provide_session(etl_config) as session:
|
|
135
|
+
result = session.select_one(
|
|
136
|
+
"SELECT open_prompt(?)",
|
|
137
|
+
"Can you write a haiku about DuckDB?",
|
|
138
|
+
schema_type=ChatMessage
|
|
139
|
+
)
|
|
140
|
+
print(result) # result is a ChatMessage pydantic model
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### DuckDB Gemini Embeddings
|
|
144
|
+
|
|
145
|
+
In this example, we are again using DuckDB. However, we are going to use the built in to call the Google Gemini embeddings service directly from the database.
|
|
146
|
+
|
|
147
|
+
This example will
|
|
148
|
+
|
|
149
|
+
- auto installs the `http_client` and `vss` (vector similarity search) DuckDB extensions
|
|
150
|
+
- when a connection is created, it ensures that the `generate_embeddings` macro exists in the DuckDB database.
|
|
151
|
+
- Execute a simple query to call the Google API
|
|
152
|
+
|
|
153
|
+
```py
|
|
154
|
+
# /// script
|
|
155
|
+
# dependencies = [
|
|
156
|
+
# "sqlspec[duckdb,performance]",
|
|
157
|
+
# ]
|
|
158
|
+
# ///
|
|
159
|
+
import os
|
|
160
|
+
|
|
161
|
+
from sqlspec import SQLSpec
|
|
162
|
+
from sqlspec.adapters.duckdb import DuckDBConfig
|
|
163
|
+
|
|
164
|
+
EMBEDDING_MODEL = "gemini-embedding-exp-03-07"
|
|
165
|
+
GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY")
|
|
166
|
+
API_URL = (
|
|
167
|
+
f"https://generativelanguage.googleapis.com/v1beta/models/{EMBEDDING_MODEL}:embedContent?key=${GOOGLE_API_KEY}"
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
sql = SQLSpec()
|
|
171
|
+
etl_config = sql.add_config(
|
|
172
|
+
DuckDBConfig(
|
|
173
|
+
extensions=[{"name": "vss"}, {"name": "http_client"}],
|
|
174
|
+
on_connection_create=lambda connection: connection.execute(f"""
|
|
175
|
+
CREATE IF NOT EXISTS MACRO generate_embedding(q) AS (
|
|
176
|
+
WITH __request AS (
|
|
177
|
+
SELECT http_post(
|
|
178
|
+
'{API_URL}',
|
|
179
|
+
headers => MAP {{
|
|
180
|
+
'accept': 'application/json',
|
|
181
|
+
}},
|
|
182
|
+
params => MAP {{
|
|
183
|
+
'model': 'models/{EMBEDDING_MODEL}',
|
|
184
|
+
'parts': [{{ 'text': q }}],
|
|
185
|
+
'taskType': 'SEMANTIC_SIMILARITY'
|
|
186
|
+
}}
|
|
187
|
+
) AS response
|
|
188
|
+
)
|
|
189
|
+
SELECT *
|
|
190
|
+
FROM __request,
|
|
191
|
+
);
|
|
192
|
+
"""),
|
|
193
|
+
)
|
|
194
|
+
)
|
|
195
|
+
with sql.provide_session(etl_config) as session:
|
|
196
|
+
result = session.select_one("SELECT generate_embedding('example text')")
|
|
197
|
+
print(result) # result is a dictionary when `schema_type` is omitted.
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Basic Litestar Integration
|
|
201
|
+
|
|
202
|
+
In this example we are going to demonstrate how to create a basic configuration that integrates into Litestar.
|
|
203
|
+
|
|
204
|
+
```py
|
|
205
|
+
# /// script
|
|
206
|
+
# dependencies = [
|
|
207
|
+
# "sqlspec[aiosqlite]",
|
|
208
|
+
# "litestar[standard]",
|
|
209
|
+
# ]
|
|
210
|
+
# ///
|
|
211
|
+
|
|
212
|
+
from aiosqlite import Connection
|
|
213
|
+
from litestar import Litestar, get
|
|
214
|
+
|
|
215
|
+
from sqlspec.adapters.aiosqlite import AiosqliteConfig, AiosqliteDriver
|
|
216
|
+
from sqlspec.extensions.litestar import SQLSpec
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
@get("/")
|
|
220
|
+
async def simple_sqlite(db_session: AiosqliteDriver) -> dict[str, str]:
|
|
221
|
+
return await db_session.select_one("SELECT 'Hello, world!' AS greeting")
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
sqlspec = SQLSpec(config=DatabaseConfig(
|
|
225
|
+
config=[AiosqliteConfig(), commit_mode="autocommit")],
|
|
226
|
+
)
|
|
227
|
+
app = Litestar(route_handlers=[simple_sqlite], plugins=[sqlspec])
|
|
228
|
+
```
|
|
229
|
+
|
|
86
230
|
## Inspiration and Future Direction
|
|
87
231
|
|
|
88
232
|
SQLSpec originally drew inspiration from features found in the `aiosql` library. This is a great library for working with and executed SQL stored in files. It's unclear how much of an overlap there will be between the two libraries, but it's possible that some features will be contributed back to `aiosql` where appropriate.
|
|
@@ -110,7 +254,7 @@ This list is not final. If you have a driver you'd like to see added, please ope
|
|
|
110
254
|
| [`oracledb`](https://oracle.github.io/python-oracledb/) | Oracle | Async | ✅ |
|
|
111
255
|
| [`oracledb`](https://oracle.github.io/python-oracledb/) | Oracle | Sync | ✅ |
|
|
112
256
|
| [`duckdb`](https://duckdb.org/) | DuckDB | Sync | ✅ |
|
|
113
|
-
| [`bigquery`](https://googleapis.dev/python/bigquery/latest/index.html) | BigQuery | Sync |
|
|
257
|
+
| [`bigquery`](https://googleapis.dev/python/bigquery/latest/index.html) | BigQuery | Sync | ✅ |
|
|
114
258
|
| [`spanner`](https://googleapis.dev/python/spanner/latest/index.html) | Spanner | Sync | 🗓️ |
|
|
115
259
|
| [`sqlserver`](https://docs.microsoft.com/en-us/sql/connect/python/pyodbc/python-sql-driver-for-pyodbc?view=sql-server-ver16) | SQL Server | Sync | 🗓️ |
|
|
116
260
|
| [`mysql`](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysql-connector-python.html) | MySQL | Sync | 🗓️ |
|
|
@@ -121,7 +265,7 @@ This list is not final. If you have a driver you'd like to see added, please ope
|
|
|
121
265
|
- `sqlspec/`:
|
|
122
266
|
- `adapters/`: Contains all database drivers and associated configuration.
|
|
123
267
|
- `extensions/`:
|
|
124
|
-
- `litestar/`:
|
|
268
|
+
- `litestar/`: Litestar framework integration ✅
|
|
125
269
|
- `fastapi/`: Future home of `fastapi` integration.
|
|
126
270
|
- `flask/`: Future home of `flask` integration.
|
|
127
271
|
- `*/`: Future home of your favorite framework integration 🔌 ✨
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
sqlspec/__init__.py,sha256=Dl1QOZAK21--ORQcRn15n4YPFklFMe2-Lb7TWWq_WQE,338
|
|
2
|
+
sqlspec/__metadata__.py,sha256=hNP3wXvtk8fQVPKGjRLpZ9mP-gaPJqzrmgm3UqpDIXQ,460
|
|
3
|
+
sqlspec/_serialization.py,sha256=tSwWwFImlYviC6ARdXRz0Bp4QXbCdc8cKGgZr33OglY,2657
|
|
4
|
+
sqlspec/_typing.py,sha256=6ukndnNu_XWKf2OW-HP1x1L7YmqohMwjg2HF4Hq3xdU,7111
|
|
5
|
+
sqlspec/base.py,sha256=SQDE27igKL6OVQ-D9lz3oNrEZz4vWggRSuE4SDXJSbs,32789
|
|
6
|
+
sqlspec/exceptions.py,sha256=WnA56CdDSSdOjA5UE4jnfXXtrfClgwjCRxT-id0eVAo,4302
|
|
7
|
+
sqlspec/filters.py,sha256=Gqwt4VQ7e8ffphkuR-jBfqW4m0OWGGUPiYWyEQ0Xn7M,3620
|
|
8
|
+
sqlspec/mixins.py,sha256=JWniOJfjviNBpAj3AnTnd2ZA79C0Vcu-bVHPS3Lbxcg,4751
|
|
9
|
+
sqlspec/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
sqlspec/statement.py,sha256=lbnF_flv4sWPPiZtHX-53d72eCFcceBYB4BgQQYjnCU,17451
|
|
11
|
+
sqlspec/typing.py,sha256=eMLeqi-j28PNLs8jBb4oxeMjOe95jjV1DW8FIp0uCJY,15932
|
|
12
|
+
sqlspec/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
sqlspec/adapters/adbc/__init__.py,sha256=Ih0mdciGyhmOlqmz4uiByj7mEaqvP4upRjYhlUNopAQ,193
|
|
14
|
+
sqlspec/adapters/adbc/config.py,sha256=uCY-PD06QFJW0v7XpA9vruYgq1eoVwQ63juZe9imMu4,9663
|
|
15
|
+
sqlspec/adapters/adbc/driver.py,sha256=Q619R8nFdSk-lPab2jk0F5xkzhXZPEDqbxw-67_1NBM,20100
|
|
16
|
+
sqlspec/adapters/aiosqlite/__init__.py,sha256=CndH49GREnHuIB-jY1XAxVlLwZTvKNuk8XJu9jiiM7A,233
|
|
17
|
+
sqlspec/adapters/aiosqlite/config.py,sha256=tE-DnjKbdy5FaqqRyA1q3s06rMSAglt0HkhO2oWQT2w,4603
|
|
18
|
+
sqlspec/adapters/aiosqlite/driver.py,sha256=319ixRaD03L465xa5ZsK2pXXaZ7wIxuWDm7ZXr-OMcg,15552
|
|
19
|
+
sqlspec/adapters/asyncmy/__init__.py,sha256=7jQFc0WOgc58XPeIiDgX9a95scMa6PuFgGXQaxG33nI,291
|
|
20
|
+
sqlspec/adapters/asyncmy/config.py,sha256=5ILV46FWjc9Cy46aMuhinpfc70b_708h9ubHj9HRCmE,9412
|
|
21
|
+
sqlspec/adapters/asyncmy/driver.py,sha256=yFgSNtInWshm994eiKd8c_rNJtM1mToAHfQ039egci0,12376
|
|
22
|
+
sqlspec/adapters/asyncpg/__init__.py,sha256=iR-vJYxImcw5hLaDgMqPLLRxW_vOYylEpemSg5G4dP4,261
|
|
23
|
+
sqlspec/adapters/asyncpg/config.py,sha256=yhLcZyJksx9eKUGVlcKSsR7FQmj8F2caryeTdh1CNvQ,9966
|
|
24
|
+
sqlspec/adapters/asyncpg/driver.py,sha256=93f7ePb91GSrmJhAaMC7PwgZLvwr3RC5zq8xk8OEQPw,22431
|
|
25
|
+
sqlspec/adapters/bigquery/__init__.py,sha256=8kcl0_tnvnk8omVKnAljIY9n2XVnzkPRCfhfedGO0m4,264
|
|
26
|
+
sqlspec/adapters/bigquery/driver.py,sha256=8Y9Iq3d9U11wLOrd7_QlmAXMF3VAg7Werp0i5v0WStg,28402
|
|
27
|
+
sqlspec/adapters/bigquery/config/__init__.py,sha256=4ij4LAS-kIt-vOK8KetewVoYN90i1RV_BjtowKWDIs0,150
|
|
28
|
+
sqlspec/adapters/bigquery/config/_common.py,sha256=LSbBC302-Ewx8XHTRzYR-tInMYywVW9I6UcL8cO7-HQ,1901
|
|
29
|
+
sqlspec/adapters/bigquery/config/_sync.py,sha256=oglaEErXuce1TnE2wj5KrfFLkScRGFYAoOTCVV5BFcw,3323
|
|
30
|
+
sqlspec/adapters/duckdb/__init__.py,sha256=GMSHigyHgtaJKu751kE_Sxl5Ry4hnQOnFUSIeLSg1qs,209
|
|
31
|
+
sqlspec/adapters/duckdb/config.py,sha256=b-Ev7UnpguC12CJSxK9DDqcPw0R2dZUZXaVIePf_EEg,15700
|
|
32
|
+
sqlspec/adapters/duckdb/driver.py,sha256=rpBIGuAQlHtUp3oVInjdMdCQSgyx_oiOP39sjGlrdOA,13960
|
|
33
|
+
sqlspec/adapters/oracledb/__init__.py,sha256=vVe8cXZJLFvBA6LPx4NzGRLdOeRugzRjz92UYjb0lC0,521
|
|
34
|
+
sqlspec/adapters/oracledb/driver.py,sha256=nLsSggAN4Zs1uo6J3Cd_3f0e54EzjLAoTlgaatb5ll8,31053
|
|
35
|
+
sqlspec/adapters/oracledb/config/__init__.py,sha256=emx5jWXqw3ifoW-m_tNI7sTz_duq2vRkubc0J2QqEQ4,306
|
|
36
|
+
sqlspec/adapters/oracledb/config/_asyncio.py,sha256=k0wGr4FflFR03jUSgrw-4LC4mYtRlyH9gnbbBXNcMRM,7310
|
|
37
|
+
sqlspec/adapters/oracledb/config/_common.py,sha256=UJZL2DQQZM3uOn1E1A_gnsB8nX3-yCDXGd66PDI29_s,5691
|
|
38
|
+
sqlspec/adapters/oracledb/config/_sync.py,sha256=nm5FnrRG1ScrNviw3MR_40Vq8WJCXX5mJGtHhhRTPb0,7055
|
|
39
|
+
sqlspec/adapters/psqlpy/__init__.py,sha256=K8UlQrKfbCZmxGAaT4CHzQvdwGPxPLB9TDOHJgkESFc,251
|
|
40
|
+
sqlspec/adapters/psqlpy/config.py,sha256=qssXcu_Nd6o_X8QU1i61sAXwi9FiTApWxiTRU0gyBhk,10205
|
|
41
|
+
sqlspec/adapters/psqlpy/driver.py,sha256=dDLH6OyCIEtCjPktBcZEmRqBEB3FUaczpQrPDVNfAtc,17165
|
|
42
|
+
sqlspec/adapters/psycopg/__init__.py,sha256=xmFWHSB6hwPNQS1wpBmAczJThABmhRv2PDNKqaMFX3E,535
|
|
43
|
+
sqlspec/adapters/psycopg/driver.py,sha256=LelXlEWMn9gcuMPYz9WsRfEds3y08A-XmXzVIgA5zio,28746
|
|
44
|
+
sqlspec/adapters/psycopg/config/__init__.py,sha256=hUmtNkSma4M-Y66B-l1gh601Lx7FVYVhU0BWo9ssdJo,570
|
|
45
|
+
sqlspec/adapters/psycopg/config/_async.py,sha256=oKitbfpsJVLhMnbMUmICQub3rBzVZ5n9lwsU_ZvB45s,6661
|
|
46
|
+
sqlspec/adapters/psycopg/config/_common.py,sha256=UqqvqPE9zlSO9G_Gh6fI190cHfCDG98S0GaznGAHpdU,2181
|
|
47
|
+
sqlspec/adapters/psycopg/config/_sync.py,sha256=GYPgE7jfb15gbVdTWRoGGS3B7hauN8wk61CW6Bdrjcs,6512
|
|
48
|
+
sqlspec/adapters/sqlite/__init__.py,sha256=N8VL4Y850OOt63qz-Yvu6rIaCXiziASmn_qDY5tsRuA,209
|
|
49
|
+
sqlspec/adapters/sqlite/config.py,sha256=lGz0G-JFd7dZLhbUrITn9V-ipbhlekwNUr0bXEzM-8k,4498
|
|
50
|
+
sqlspec/adapters/sqlite/driver.py,sha256=S7__m5AJst86tKaDCYyyeBixbeyiPxqECkeNX_a4sgs,14057
|
|
51
|
+
sqlspec/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
52
|
+
sqlspec/extensions/litestar/__init__.py,sha256=vJf0co-AUM75c7ZLil_TUCYilVNDtmVsdeVLbm9_xn8,512
|
|
53
|
+
sqlspec/extensions/litestar/_utils.py,sha256=UgwFxqLnjDw9S8G0H24DP2GsbMGas81W1lfhfTY68m8,1969
|
|
54
|
+
sqlspec/extensions/litestar/config.py,sha256=M91ClAl15twFYcsQyJ-w-CdW5dMAxHztRlTDqg2hw_M,4368
|
|
55
|
+
sqlspec/extensions/litestar/handlers.py,sha256=eO5rmj3LcomaPerZ6Mpsur3J0QmucutjByQlID0XZtM,7962
|
|
56
|
+
sqlspec/extensions/litestar/plugin.py,sha256=kQgKnBIXnSm87SAngfSfYWAAN3BNZ6fPLxm2MefnD8Q,5216
|
|
57
|
+
sqlspec/utils/__init__.py,sha256=nVIUuMaHhhC1vXydoSBvnc-xTArqwWJaAtpjHhiM84Q,159
|
|
58
|
+
sqlspec/utils/deprecation.py,sha256=4pwGxoQYI3dAc3L1lh4tszZG6e2jp5m4e0ICk8SJx5M,3886
|
|
59
|
+
sqlspec/utils/fixtures.py,sha256=ni51rAuen6S1wuSi1kUwn6Qh25B-XrewPEsjV8G4gQ0,2029
|
|
60
|
+
sqlspec/utils/module_loader.py,sha256=tmMy9JcTTQETcwT8Wt8adCIuqr4zinQnPbCiBJ6JTSQ,2703
|
|
61
|
+
sqlspec/utils/sync_tools.py,sha256=xxHZ-5rnTrPEUNr7gxQUVvJd0NGJeO_MgisR8X7sI3c,10425
|
|
62
|
+
sqlspec/utils/text.py,sha256=Ya-fWBcfkQRhguNs7MNFIYtAUiArBo62w8sRPHavMWM,1476
|
|
63
|
+
sqlspec-0.10.0.dist-info/METADATA,sha256=kVW_aG4aRxpkvbCQGlPfEhZRq8iSGk4rFd1bWmhAhFA,14034
|
|
64
|
+
sqlspec-0.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
65
|
+
sqlspec-0.10.0.dist-info/licenses/LICENSE,sha256=MdujfZ6l5HuLz4mElxlu049itenOR3gnhN1_Nd3nVcM,1078
|
|
66
|
+
sqlspec-0.10.0.dist-info/licenses/NOTICE,sha256=Lyir8ozXWov7CyYS4huVaOCNrtgL17P-bNV-5daLntQ,1634
|
|
67
|
+
sqlspec-0.10.0.dist-info/RECORD,,
|
sqlspec-0.9.0.dist-info/RECORD
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
sqlspec/__init__.py,sha256=dsOivB7SmZhOcWkZQT12L4LHC6fQhWBk2s_3j85KkgQ,316
|
|
2
|
-
sqlspec/__metadata__.py,sha256=hNP3wXvtk8fQVPKGjRLpZ9mP-gaPJqzrmgm3UqpDIXQ,460
|
|
3
|
-
sqlspec/_serialization.py,sha256=tSwWwFImlYviC6ARdXRz0Bp4QXbCdc8cKGgZr33OglY,2657
|
|
4
|
-
sqlspec/_typing.py,sha256=6ukndnNu_XWKf2OW-HP1x1L7YmqohMwjg2HF4Hq3xdU,7111
|
|
5
|
-
sqlspec/base.py,sha256=vYXMVrdxEhaRfeAD4MVz9izY_mbCg5G3rbNchJ7vp0Q,24539
|
|
6
|
-
sqlspec/exceptions.py,sha256=EyS7B9qyyTo78CdkC5iQDYFW9eXILDA6xiSS4ABr0Ws,4033
|
|
7
|
-
sqlspec/filters.py,sha256=Gqwt4VQ7e8ffphkuR-jBfqW4m0OWGGUPiYWyEQ0Xn7M,3620
|
|
8
|
-
sqlspec/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
sqlspec/statement.py,sha256=lbnF_flv4sWPPiZtHX-53d72eCFcceBYB4BgQQYjnCU,17451
|
|
10
|
-
sqlspec/typing.py,sha256=AI-72LFQcwwPoW5oEdEFkNHzxnWQv6I7lxcZRoZd88U,15428
|
|
11
|
-
sqlspec/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
sqlspec/adapters/adbc/__init__.py,sha256=_mIoHMCXYWLCqGtnN8YEylhkNt3goTAvZgsT1dfEL6g,155
|
|
13
|
-
sqlspec/adapters/adbc/config.py,sha256=e2lrNsr8VN6R1ZBY16qusNj_W7npy7jp730NXCnhbBI,9866
|
|
14
|
-
sqlspec/adapters/adbc/driver.py,sha256=lP9YEf5sUmeWRBULVZurfiRvE1sMuYdGzvCibzQPALw,16255
|
|
15
|
-
sqlspec/adapters/aiosqlite/__init__.py,sha256=TQME6tGSPswTkZBjW2oH39lbxpzSwwWG5SQfgFpSe00,185
|
|
16
|
-
sqlspec/adapters/aiosqlite/config.py,sha256=EjDJq9-Jn6MKnqlpL4ZwXYxaCKD0wE5GxrSYa2Ck1bA,4788
|
|
17
|
-
sqlspec/adapters/aiosqlite/driver.py,sha256=D6kTpRxcfD_NSH7ThcVq2VbYZz0iriCh_CMjPQBl_Z8,11466
|
|
18
|
-
sqlspec/adapters/asyncmy/__init__.py,sha256=w0hjokFrsBgYS0EnIv8Dorb7jz8M3ZBZYKMUXCUYEQg,247
|
|
19
|
-
sqlspec/adapters/asyncmy/config.py,sha256=5ILV46FWjc9Cy46aMuhinpfc70b_708h9ubHj9HRCmE,9412
|
|
20
|
-
sqlspec/adapters/asyncmy/driver.py,sha256=RICHrYxv2jOUk0m4bex0k2YVc5GMnSnOdrMIp4p4fNo,8507
|
|
21
|
-
sqlspec/adapters/asyncpg/__init__.py,sha256=iR-vJYxImcw5hLaDgMqPLLRxW_vOYylEpemSg5G4dP4,261
|
|
22
|
-
sqlspec/adapters/asyncpg/config.py,sha256=DH6ZLkL4iHmRbW80VFQK1kzWIFRyGkFAZdtF3_f13AQ,9987
|
|
23
|
-
sqlspec/adapters/asyncpg/driver.py,sha256=G6CSo3k1EzmPTZr2cCnTchR7J_O-1_uNC5eKylFMysY,18557
|
|
24
|
-
sqlspec/adapters/duckdb/__init__.py,sha256=b_4QWZC0emTsbuBjcDZrxoEc83hGuBMx7Wwha3fFTAE,167
|
|
25
|
-
sqlspec/adapters/duckdb/config.py,sha256=GJTzKp1cEFhKSe94n5wOXvrT4Sz3Md8mKRxmCBnfvsM,15731
|
|
26
|
-
sqlspec/adapters/duckdb/driver.py,sha256=e91Iu84FbZ7NefqxkhmWZcwICav0lxJpAxxD08sFqUk,10160
|
|
27
|
-
sqlspec/adapters/oracledb/__init__.py,sha256=g54_WLVzZhvD1sLC2uV0nfUs6WnYUJv2vqvvG34L7v0,398
|
|
28
|
-
sqlspec/adapters/oracledb/driver.py,sha256=1YCj0pyaIMB-WXi_2w0ywRR0DlAlz5Q6k4gjGkY2yDE,23081
|
|
29
|
-
sqlspec/adapters/oracledb/config/__init__.py,sha256=emx5jWXqw3ifoW-m_tNI7sTz_duq2vRkubc0J2QqEQ4,306
|
|
30
|
-
sqlspec/adapters/oracledb/config/_asyncio.py,sha256=hu4o5q_d1O7svR_XrylWcmMrvmBzOp0T1m_Ybrbbr_o,7293
|
|
31
|
-
sqlspec/adapters/oracledb/config/_common.py,sha256=UJZL2DQQZM3uOn1E1A_gnsB8nX3-yCDXGd66PDI29_s,5691
|
|
32
|
-
sqlspec/adapters/oracledb/config/_sync.py,sha256=wvmC8bX2FhSD3W-k4RUBXnMP6cvEThsO6-vA-q5flUY,7016
|
|
33
|
-
sqlspec/adapters/psqlpy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
-
sqlspec/adapters/psqlpy/config.py,sha256=SFa40Fp0HyrAAT49nNoH9gYovzk0iEhm6qMmqS9OgDI,10590
|
|
35
|
-
sqlspec/adapters/psqlpy/driver.py,sha256=8DnLXFwIUkGtlu-xpj2O4lAaERIIRVVbNgkL6GQ7Qgk,12844
|
|
36
|
-
sqlspec/adapters/psycopg/__init__.py,sha256=_aCZRfDiC4lXM5UdkYEQEHZq-bqY1nyS_sioTM91Ul0,408
|
|
37
|
-
sqlspec/adapters/psycopg/driver.py,sha256=4hQfw_hHuzZJYz1gKVECRAAdchop-ZIVWg9fZjY-NUM,21296
|
|
38
|
-
sqlspec/adapters/psycopg/config/__init__.py,sha256=TIFGht0TdHKC7NTJwaJPpG-6-BRRGzWfc2Bu756R-A4,310
|
|
39
|
-
sqlspec/adapters/psycopg/config/_async.py,sha256=6YpxNLxHwvI7r7ZBKKjWnd0xbEG1i4HLOOimiiDUr6w,6631
|
|
40
|
-
sqlspec/adapters/psycopg/config/_common.py,sha256=UqqvqPE9zlSO9G_Gh6fI190cHfCDG98S0GaznGAHpdU,2181
|
|
41
|
-
sqlspec/adapters/psycopg/config/_sync.py,sha256=QIybrGVkuu45GlAcYBzpcsRq7VW6EnHff4fcNATAgsw,6443
|
|
42
|
-
sqlspec/adapters/sqlite/__init__.py,sha256=cGsMyN4_ZWApbhtwmYG18PYEBRiO-NdOU6eecBxTwRQ,167
|
|
43
|
-
sqlspec/adapters/sqlite/config.py,sha256=m2TV-3jcjxIeMSCTsvvrTm50L6uE3007WVPluvqIX3Q,4447
|
|
44
|
-
sqlspec/adapters/sqlite/driver.py,sha256=quh0Bazho05QVRWxy_Jww02I6HKLFg8Q0jUWMtfBjEU,11293
|
|
45
|
-
sqlspec/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
|
-
sqlspec/extensions/litestar/__init__.py,sha256=vJf0co-AUM75c7ZLil_TUCYilVNDtmVsdeVLbm9_xn8,512
|
|
47
|
-
sqlspec/extensions/litestar/_utils.py,sha256=UgwFxqLnjDw9S8G0H24DP2GsbMGas81W1lfhfTY68m8,1969
|
|
48
|
-
sqlspec/extensions/litestar/config.py,sha256=zq_mlwNubDhRAtAivi2d5S5ippJ1A5xhw19XC6yPC60,4443
|
|
49
|
-
sqlspec/extensions/litestar/handlers.py,sha256=6FNqIEWHUltnNuhcp8QNktK0j6-UB4isMpzoP7qCc3g,7932
|
|
50
|
-
sqlspec/extensions/litestar/plugin.py,sha256=TOXz5Np17DbNaPhPp09-88reDHE29kmMjmRe4W5_-zE,4904
|
|
51
|
-
sqlspec/utils/__init__.py,sha256=nVIUuMaHhhC1vXydoSBvnc-xTArqwWJaAtpjHhiM84Q,159
|
|
52
|
-
sqlspec/utils/deprecation.py,sha256=4pwGxoQYI3dAc3L1lh4tszZG6e2jp5m4e0ICk8SJx5M,3886
|
|
53
|
-
sqlspec/utils/fixtures.py,sha256=ni51rAuen6S1wuSi1kUwn6Qh25B-XrewPEsjV8G4gQ0,2029
|
|
54
|
-
sqlspec/utils/module_loader.py,sha256=tmMy9JcTTQETcwT8Wt8adCIuqr4zinQnPbCiBJ6JTSQ,2703
|
|
55
|
-
sqlspec/utils/sync_tools.py,sha256=xxHZ-5rnTrPEUNr7gxQUVvJd0NGJeO_MgisR8X7sI3c,10425
|
|
56
|
-
sqlspec/utils/text.py,sha256=Ya-fWBcfkQRhguNs7MNFIYtAUiArBo62w8sRPHavMWM,1476
|
|
57
|
-
sqlspec-0.9.0.dist-info/METADATA,sha256=zKfhk4Zk5WwoRzWlGqFTERFpN5kDOaFW77k7gU52tBo,9616
|
|
58
|
-
sqlspec-0.9.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
59
|
-
sqlspec-0.9.0.dist-info/licenses/LICENSE,sha256=MdujfZ6l5HuLz4mElxlu049itenOR3gnhN1_Nd3nVcM,1078
|
|
60
|
-
sqlspec-0.9.0.dist-info/licenses/NOTICE,sha256=Lyir8ozXWov7CyYS4huVaOCNrtgL17P-bNV-5daLntQ,1634
|
|
61
|
-
sqlspec-0.9.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|