Skip to content

Commit db59d09

Browse files
authored
feat: implements a SQLTranslatorMixin mixin for SQL conversion. (#27)
Implements a `SQLTranslatorMixin` mixin that has a `convert_to_dialect` method for tranlating SQL between dialects.
1 parent 4bb507f commit db59d09

File tree

20 files changed

+283
-123
lines changed

20 files changed

+283
-123
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ etl_config = sql.add_config(
7070
)
7171
)
7272
with sql.provide_session(etl_config) as session:
73-
result = session.select_one("SELECT open_prompt(?)", "Can you write a haiku about DuckDB?", schema_type=ChatMessage)
73+
result = session.select_one(
74+
"SELECT open_prompt(?)",
75+
"Can you write a haiku about DuckDB?",
76+
schema_type=ChatMessage
77+
)
7478
print(result) # result is a ChatMessage pydantic model
7579
```
7680

docs/PYPI_README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ etl_config = sql.add_config(
7070
)
7171
)
7272
with sql.provide_session(etl_config) as session:
73-
result = session.select_one("SELECT open_prompt(?)", "Can you write a haiku about DuckDB?", schema_type=ChatMessage)
73+
result = session.select_one(
74+
"SELECT open_prompt(?)",
75+
"Can you write a haiku about DuckDB?",
76+
schema_type=ChatMessage
77+
)
7478
print(result) # result is a ChatMessage pydantic model
7579
```
7680

sqlspec/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlspec import adapters, base, exceptions, extensions, filters, typing, utils
1+
from sqlspec import adapters, base, exceptions, extensions, filters, mixins, typing, utils
22
from sqlspec.__metadata__ import __version__
33
from sqlspec.base import SQLSpec
44

@@ -10,6 +10,7 @@
1010
"exceptions",
1111
"extensions",
1212
"filters",
13+
"mixins",
1314
"typing",
1415
"utils",
1516
)

sqlspec/adapters/adbc/driver.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
from adbc_driver_manager.dbapi import Connection, Cursor
99

10-
from sqlspec.base import SyncArrowBulkOperationsMixin, SyncDriverAdapterProtocol, T
10+
from sqlspec.base import SyncDriverAdapterProtocol
1111
from sqlspec.exceptions import ParameterStyleMismatchError, SQLParsingError
12+
from sqlspec.mixins import SQLTranslatorMixin, SyncArrowBulkOperationsMixin
1213
from sqlspec.statement import SQLStatement
1314
from sqlspec.typing import ArrowTable, StatementParameterType
1415

1516
if TYPE_CHECKING:
16-
from sqlspec.typing import ArrowTable, ModelDTOT, StatementParameterType
17+
from sqlspec.typing import ArrowTable, ModelDTOT, StatementParameterType, T
1718

1819
__all__ = ("AdbcDriver",)
1920

@@ -33,7 +34,11 @@
3334
)
3435

3536

36-
class AdbcDriver(SyncArrowBulkOperationsMixin["Connection"], SyncDriverAdapterProtocol["Connection"]):
37+
class AdbcDriver(
38+
SyncArrowBulkOperationsMixin["Connection"],
39+
SQLTranslatorMixin["Connection"],
40+
SyncDriverAdapterProtocol["Connection"],
41+
):
3742
"""ADBC Sync Driver Adapter."""
3843

3944
connection: Connection

sqlspec/adapters/aiosqlite/driver.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
from contextlib import asynccontextmanager
22
from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
33

4-
from sqlspec.base import AsyncDriverAdapterProtocol, T
4+
from sqlspec.base import AsyncDriverAdapterProtocol
5+
from sqlspec.mixins import SQLTranslatorMixin
56

67
if TYPE_CHECKING:
78
from collections.abc import AsyncGenerator, Sequence
89

910
from aiosqlite import Connection, Cursor
1011

11-
from sqlspec.typing import ModelDTOT, StatementParameterType
12+
from sqlspec.typing import ModelDTOT, StatementParameterType, T
1213

1314
__all__ = ("AiosqliteDriver",)
1415

1516

16-
class AiosqliteDriver(AsyncDriverAdapterProtocol["Connection"]):
17+
class AiosqliteDriver(
18+
SQLTranslatorMixin["Connection"],
19+
AsyncDriverAdapterProtocol["Connection"],
20+
):
1721
"""SQLite Async Driver Adapter."""
1822

1923
connection: "Connection"

sqlspec/adapters/asyncmy/driver.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,22 @@
33
from contextlib import asynccontextmanager
44
from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
55

6-
from sqlspec.base import AsyncDriverAdapterProtocol, T
6+
from sqlspec.base import AsyncDriverAdapterProtocol
7+
from sqlspec.mixins import SQLTranslatorMixin
78

89
if TYPE_CHECKING:
910
from asyncmy import Connection
1011
from asyncmy.cursors import Cursor
1112

12-
from sqlspec.typing import ModelDTOT, StatementParameterType
13+
from sqlspec.typing import ModelDTOT, StatementParameterType, T
1314

1415
__all__ = ("AsyncmyDriver",)
1516

1617

17-
class AsyncmyDriver(AsyncDriverAdapterProtocol["Connection"]):
18+
class AsyncmyDriver(
19+
SQLTranslatorMixin["Connection"],
20+
AsyncDriverAdapterProtocol["Connection"],
21+
):
1822
"""Asyncmy MySQL/MariaDB Driver Adapter."""
1923

2024
connection: "Connection"

sqlspec/adapters/asyncpg/driver.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
from asyncpg import Connection
66
from typing_extensions import TypeAlias
77

8-
from sqlspec.base import AsyncDriverAdapterProtocol, T
8+
from sqlspec.base import AsyncDriverAdapterProtocol
99
from sqlspec.exceptions import SQLParsingError
10+
from sqlspec.mixins import SQLTranslatorMixin
1011
from sqlspec.statement import PARAM_REGEX, SQLStatement
1112

1213
if TYPE_CHECKING:
@@ -15,7 +16,7 @@
1516
from asyncpg.connection import Connection
1617
from asyncpg.pool import PoolConnectionProxy
1718

18-
from sqlspec.typing import ModelDTOT, StatementParameterType
19+
from sqlspec.typing import ModelDTOT, StatementParameterType, T
1920

2021
__all__ = ("AsyncpgConnection", "AsyncpgDriver")
2122

@@ -35,7 +36,10 @@
3536
AsyncpgConnection: TypeAlias = "Union[Connection[Any], PoolConnectionProxy[Any]]" # pyright: ignore[reportMissingTypeArgument]
3637

3738

38-
class AsyncpgDriver(AsyncDriverAdapterProtocol["AsyncpgConnection"]):
39+
class AsyncpgDriver(
40+
SQLTranslatorMixin["AsyncpgConnection"],
41+
AsyncDriverAdapterProtocol["AsyncpgConnection"],
42+
):
3943
"""AsyncPG Postgres Driver Adapter."""
4044

4145
connection: "AsyncpgConnection"

sqlspec/adapters/duckdb/driver.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
from contextlib import contextmanager
22
from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
33

4-
from sqlspec.base import SyncArrowBulkOperationsMixin, SyncDriverAdapterProtocol, T
4+
from sqlspec.base import SyncDriverAdapterProtocol
5+
from sqlspec.mixins import SQLTranslatorMixin, SyncArrowBulkOperationsMixin
6+
from sqlspec.typing import ArrowTable, StatementParameterType
57

68
if TYPE_CHECKING:
79
from collections.abc import Generator, Sequence
810

911
from duckdb import DuckDBPyConnection
1012

11-
from sqlspec.typing import ArrowTable, ModelDTOT, StatementParameterType
13+
from sqlspec.typing import ArrowTable, ModelDTOT, StatementParameterType, T
1214

1315
__all__ = ("DuckDBDriver",)
1416

1517

16-
class DuckDBDriver(SyncArrowBulkOperationsMixin["DuckDBPyConnection"], SyncDriverAdapterProtocol["DuckDBPyConnection"]):
18+
class DuckDBDriver(
19+
SyncArrowBulkOperationsMixin["DuckDBPyConnection"],
20+
SQLTranslatorMixin["DuckDBPyConnection"],
21+
SyncDriverAdapterProtocol["DuckDBPyConnection"],
22+
):
1723
"""DuckDB Sync Driver Adapter."""
1824

1925
connection: "DuckDBPyConnection"

sqlspec/adapters/oracledb/driver.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
from contextlib import asynccontextmanager, contextmanager
22
from typing import TYPE_CHECKING, Any, Optional, Union, cast, overload
33

4-
from sqlspec.base import (
5-
AsyncArrowBulkOperationsMixin,
6-
AsyncDriverAdapterProtocol,
7-
SyncArrowBulkOperationsMixin,
8-
SyncDriverAdapterProtocol,
9-
T,
10-
)
11-
from sqlspec.typing import ArrowTable, StatementParameterType
4+
from sqlspec.base import AsyncDriverAdapterProtocol, SyncDriverAdapterProtocol
5+
from sqlspec.mixins import AsyncArrowBulkOperationsMixin, SQLTranslatorMixin, SyncArrowBulkOperationsMixin
6+
from sqlspec.typing import ArrowTable, StatementParameterType, T
127

138
if TYPE_CHECKING:
149
from collections.abc import AsyncGenerator, Generator, Sequence
@@ -21,7 +16,11 @@
2116
__all__ = ("OracleAsyncDriver", "OracleSyncDriver")
2217

2318

24-
class OracleSyncDriver(SyncArrowBulkOperationsMixin["Connection"], SyncDriverAdapterProtocol["Connection"]):
19+
class OracleSyncDriver(
20+
SyncArrowBulkOperationsMixin["Connection"],
21+
SQLTranslatorMixin["Connection"],
22+
SyncDriverAdapterProtocol["Connection"],
23+
):
2524
"""Oracle Sync Driver Adapter."""
2625

2726
connection: "Connection"
@@ -433,7 +432,9 @@ def select_arrow( # pyright: ignore[reportUnknownParameterType]
433432

434433

435434
class OracleAsyncDriver(
436-
AsyncArrowBulkOperationsMixin["AsyncConnection"], AsyncDriverAdapterProtocol["AsyncConnection"]
435+
AsyncArrowBulkOperationsMixin["AsyncConnection"],
436+
SQLTranslatorMixin["AsyncConnection"],
437+
AsyncDriverAdapterProtocol["AsyncConnection"],
437438
):
438439
"""Oracle Async Driver Adapter."""
439440

sqlspec/adapters/psqlpy/driver.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77

88
from psqlpy.exceptions import RustPSQLDriverPyBaseError
99

10-
from sqlspec.base import AsyncDriverAdapterProtocol, T
10+
from sqlspec.base import AsyncDriverAdapterProtocol
1111
from sqlspec.exceptions import SQLParsingError
12+
from sqlspec.mixins import SQLTranslatorMixin
1213
from sqlspec.statement import PARAM_REGEX, SQLStatement
1314

1415
if TYPE_CHECKING:
1516
from collections.abc import Sequence
1617

1718
from psqlpy import Connection, QueryResult
1819

19-
from sqlspec.typing import ModelDTOT, StatementParameterType
20+
from sqlspec.typing import ModelDTOT, StatementParameterType, T
2021

2122
__all__ = ("PsqlpyDriver",)
2223

@@ -33,7 +34,10 @@
3334
logger = logging.getLogger("sqlspec")
3435

3536

36-
class PsqlpyDriver(AsyncDriverAdapterProtocol["Connection"]):
37+
class PsqlpyDriver(
38+
SQLTranslatorMixin["Connection"],
39+
AsyncDriverAdapterProtocol["Connection"],
40+
):
3741
"""Psqlpy Postgres Driver Adapter."""
3842

3943
connection: "Connection"

0 commit comments

Comments
 (0)