sqlspec 0.63.0__py3-none-any.whl → 0.64.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.
- sqlspec/__init__.py +193 -73
- sqlspec/_typing.py +4 -4
- sqlspec/adapters/adbc/_typing.py +30 -3
- sqlspec/adapters/adbc/config.py +41 -2
- sqlspec/adapters/adbc/core.py +97 -8
- sqlspec/adapters/adbc/data_dictionary.py +235 -237
- sqlspec/adapters/adbc/driver.py +0 -25
- sqlspec/adapters/aiomysql/__init__.py +2 -0
- sqlspec/adapters/aiomysql/_typing.py +19 -7
- sqlspec/adapters/aiomysql/adk/store.py +10 -11
- sqlspec/adapters/aiomysql/config.py +44 -16
- sqlspec/adapters/aiomysql/core.py +25 -5
- sqlspec/adapters/aiomysql/data_dictionary.py +1 -1
- sqlspec/adapters/aiomysql/driver.py +49 -38
- sqlspec/adapters/aiomysql/litestar/__init__.py +2 -2
- sqlspec/adapters/aiomysql/litestar/store.py +20 -6
- sqlspec/adapters/aiosqlite/__init__.py +2 -1
- sqlspec/adapters/aiosqlite/_typing.py +6 -2
- sqlspec/adapters/aiosqlite/adk/store.py +1 -1
- sqlspec/adapters/aiosqlite/config.py +16 -11
- sqlspec/adapters/aiosqlite/core.py +15 -3
- sqlspec/adapters/aiosqlite/data_dictionary.py +0 -1
- sqlspec/adapters/aiosqlite/driver.py +2 -23
- sqlspec/adapters/aiosqlite/events/__init__.py +2 -2
- sqlspec/adapters/aiosqlite/events/store.py +14 -1
- sqlspec/adapters/aiosqlite/litestar/__init__.py +2 -2
- sqlspec/adapters/aiosqlite/litestar/store.py +17 -1
- sqlspec/adapters/aiosqlite/pool.py +47 -14
- sqlspec/adapters/aiosqlite/type_converter.py +30 -30
- sqlspec/adapters/arrow_odbc/_typing.py +9 -4
- sqlspec/adapters/arrow_odbc/config.py +49 -14
- sqlspec/adapters/arrow_odbc/core.py +167 -10
- sqlspec/adapters/arrow_odbc/data_dictionary.py +31 -31
- sqlspec/adapters/arrow_odbc/driver.py +38 -3
- sqlspec/adapters/asyncmy/__init__.py +2 -0
- sqlspec/adapters/asyncmy/_typing.py +31 -25
- sqlspec/adapters/asyncmy/adk/store.py +10 -10
- sqlspec/adapters/asyncmy/config.py +46 -16
- sqlspec/adapters/asyncmy/core.py +19 -4
- sqlspec/adapters/asyncmy/data_dictionary.py +1 -2
- sqlspec/adapters/asyncmy/driver.py +48 -37
- sqlspec/adapters/asyncmy/litestar/__init__.py +2 -2
- sqlspec/adapters/asyncmy/litestar/store.py +21 -7
- sqlspec/adapters/asyncpg/__init__.py +2 -1
- sqlspec/adapters/asyncpg/_typing.py +47 -2
- sqlspec/adapters/asyncpg/adk/store.py +16 -3
- sqlspec/adapters/asyncpg/config.py +56 -20
- sqlspec/adapters/asyncpg/core.py +37 -4
- sqlspec/adapters/asyncpg/data_dictionary.py +100 -101
- sqlspec/adapters/asyncpg/driver.py +38 -40
- sqlspec/adapters/asyncpg/events/__init__.py +2 -2
- sqlspec/adapters/asyncpg/events/backend.py +45 -45
- sqlspec/adapters/asyncpg/events/store.py +21 -1
- sqlspec/adapters/asyncpg/litestar/__init__.py +2 -2
- sqlspec/adapters/asyncpg/litestar/store.py +20 -1
- sqlspec/adapters/bigquery/__init__.py +7 -1
- sqlspec/adapters/bigquery/_typing.py +28 -2
- sqlspec/adapters/bigquery/adk/store.py +1 -3
- sqlspec/adapters/bigquery/config.py +129 -28
- sqlspec/adapters/bigquery/core.py +146 -101
- sqlspec/adapters/bigquery/driver.py +11 -37
- sqlspec/adapters/bigquery/events/__init__.py +2 -2
- sqlspec/adapters/bigquery/events/store.py +17 -1
- sqlspec/adapters/bigquery/litestar/__init__.py +2 -2
- sqlspec/adapters/bigquery/litestar/store.py +20 -1
- sqlspec/adapters/cockroach_asyncpg/__init__.py +2 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +10 -2
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +1 -1
- sqlspec/adapters/cockroach_asyncpg/config.py +54 -13
- sqlspec/adapters/cockroach_asyncpg/core.py +79 -12
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +97 -97
- sqlspec/adapters/cockroach_asyncpg/driver.py +47 -17
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +2 -2
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +21 -2
- sqlspec/adapters/cockroach_psycopg/__init__.py +2 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +20 -4
- sqlspec/adapters/cockroach_psycopg/adk/store.py +4 -4
- sqlspec/adapters/cockroach_psycopg/config.py +202 -83
- sqlspec/adapters/cockroach_psycopg/core.py +79 -12
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +97 -97
- sqlspec/adapters/cockroach_psycopg/driver.py +96 -36
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +6 -2
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +21 -3
- sqlspec/adapters/duckdb/__init__.py +2 -1
- sqlspec/adapters/duckdb/_typing.py +27 -3
- sqlspec/adapters/duckdb/config.py +24 -23
- sqlspec/adapters/duckdb/core.py +245 -256
- sqlspec/adapters/duckdb/driver.py +26 -26
- sqlspec/adapters/duckdb/pool.py +61 -60
- sqlspec/adapters/mssql_python/_typing.py +9 -3
- sqlspec/adapters/mssql_python/adk/store.py +10 -11
- sqlspec/adapters/mssql_python/config.py +17 -16
- sqlspec/adapters/mssql_python/core.py +63 -3
- sqlspec/adapters/mssql_python/driver.py +26 -14
- sqlspec/adapters/mssql_python/type_converter.py +1 -0
- sqlspec/adapters/mysqlconnector/__init__.py +2 -0
- sqlspec/adapters/mysqlconnector/_typing.py +4 -4
- sqlspec/adapters/mysqlconnector/adk/store.py +13 -26
- sqlspec/adapters/mysqlconnector/config.py +53 -25
- sqlspec/adapters/mysqlconnector/core.py +17 -3
- sqlspec/adapters/mysqlconnector/data_dictionary.py +4 -4
- sqlspec/adapters/mysqlconnector/driver.py +24 -28
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +6 -2
- sqlspec/adapters/mysqlconnector/litestar/store.py +24 -13
- sqlspec/adapters/oracledb/__init__.py +2 -1
- sqlspec/adapters/oracledb/_json_handlers.py +15 -4
- sqlspec/adapters/oracledb/_typing.py +29 -11
- sqlspec/adapters/oracledb/_uuid_handlers.py +36 -33
- sqlspec/adapters/oracledb/_vector_handlers.py +42 -29
- sqlspec/adapters/oracledb/adk/store.py +1 -2
- sqlspec/adapters/oracledb/config.py +13 -11
- sqlspec/adapters/oracledb/core.py +122 -35
- sqlspec/adapters/oracledb/driver.py +80 -81
- sqlspec/adapters/oracledb/events/__init__.py +10 -1
- sqlspec/adapters/oracledb/events/_hub.py +34 -73
- sqlspec/adapters/oracledb/events/backend.py +49 -94
- sqlspec/adapters/oracledb/events/store.py +74 -2
- sqlspec/adapters/oracledb/litestar/__init__.py +14 -2
- sqlspec/adapters/oracledb/litestar/store.py +65 -2
- sqlspec/adapters/psqlpy/__init__.py +2 -1
- sqlspec/adapters/psqlpy/_typing.py +34 -2
- sqlspec/adapters/psqlpy/adk/store.py +3 -10
- sqlspec/adapters/psqlpy/config.py +5 -6
- sqlspec/adapters/psqlpy/core.py +69 -102
- sqlspec/adapters/psqlpy/data_dictionary.py +100 -100
- sqlspec/adapters/psqlpy/driver.py +36 -47
- sqlspec/adapters/psqlpy/events/__init__.py +8 -2
- sqlspec/adapters/psqlpy/events/store.py +17 -1
- sqlspec/adapters/psqlpy/litestar/__init__.py +2 -2
- sqlspec/adapters/psqlpy/litestar/store.py +20 -1
- sqlspec/adapters/psqlpy/type_converter.py +1 -1
- sqlspec/adapters/psycopg/__init__.py +2 -0
- sqlspec/adapters/psycopg/_typing.py +63 -0
- sqlspec/adapters/psycopg/adk/store.py +19 -4
- sqlspec/adapters/psycopg/config.py +175 -85
- sqlspec/adapters/psycopg/core.py +56 -51
- sqlspec/adapters/psycopg/data_dictionary.py +100 -102
- sqlspec/adapters/psycopg/driver.py +47 -67
- sqlspec/adapters/psycopg/events/__init__.py +6 -1
- sqlspec/adapters/psycopg/events/store.py +22 -1
- sqlspec/adapters/psycopg/litestar/__init__.py +2 -2
- sqlspec/adapters/psycopg/litestar/store.py +20 -2
- sqlspec/adapters/psycopg/type_converter.py +5 -4
- sqlspec/adapters/pymssql/__init__.py +2 -1
- sqlspec/adapters/pymssql/_typing.py +15 -3
- sqlspec/adapters/pymssql/adk/store.py +10 -11
- sqlspec/adapters/pymssql/config.py +13 -7
- sqlspec/adapters/pymssql/core.py +22 -0
- sqlspec/adapters/pymssql/driver.py +7 -17
- sqlspec/adapters/pymssql/pool.py +47 -7
- sqlspec/adapters/pymysql/__init__.py +2 -0
- sqlspec/adapters/pymysql/_typing.py +33 -2
- sqlspec/adapters/pymysql/adk/store.py +7 -7
- sqlspec/adapters/pymysql/config.py +43 -10
- sqlspec/adapters/pymysql/core.py +27 -5
- sqlspec/adapters/pymysql/data_dictionary.py +3 -2
- sqlspec/adapters/pymysql/driver.py +49 -22
- sqlspec/adapters/pymysql/litestar/__init__.py +2 -2
- sqlspec/adapters/pymysql/litestar/store.py +24 -8
- sqlspec/adapters/pymysql/pool.py +47 -7
- sqlspec/adapters/spanner/__init__.py +2 -0
- sqlspec/adapters/spanner/_typing.py +87 -0
- sqlspec/adapters/spanner/adk/store.py +4 -5
- sqlspec/adapters/spanner/config.py +78 -24
- sqlspec/adapters/spanner/core.py +24 -10
- sqlspec/adapters/spanner/driver.py +11 -33
- sqlspec/adapters/spanner/litestar/__init__.py +2 -2
- sqlspec/adapters/spanner/litestar/store.py +21 -4
- sqlspec/adapters/spanner/type_converter.py +77 -34
- sqlspec/adapters/sqlite/__init__.py +2 -1
- sqlspec/adapters/sqlite/_typing.py +11 -3
- sqlspec/adapters/sqlite/adk/store.py +1 -1
- sqlspec/adapters/sqlite/config.py +16 -5
- sqlspec/adapters/sqlite/core.py +16 -2
- sqlspec/adapters/sqlite/driver.py +20 -23
- sqlspec/adapters/sqlite/events/__init__.py +2 -2
- sqlspec/adapters/sqlite/events/store.py +14 -1
- sqlspec/adapters/sqlite/litestar/__init__.py +2 -2
- sqlspec/adapters/sqlite/litestar/store.py +17 -1
- sqlspec/adapters/sqlite/pool.py +155 -75
- sqlspec/adapters/sqlite/type_converter.py +30 -30
- sqlspec/builder/__init__.py +215 -90
- sqlspec/builder/_base.py +55 -54
- sqlspec/builder/_column.py +21 -6
- sqlspec/builder/_ddl.py +12 -12
- sqlspec/builder/_dml.py +0 -15
- sqlspec/builder/_expression_wrappers.py +8 -1
- sqlspec/builder/_factory.py +103 -103
- sqlspec/builder/_insert.py +1 -1
- sqlspec/builder/_join.py +100 -100
- sqlspec/builder/_locking.py +12 -12
- sqlspec/builder/_merge.py +36 -41
- sqlspec/builder/_parsing_utils.py +36 -38
- sqlspec/builder/_select.py +49 -58
- sqlspec/builder/_temporal.py +48 -48
- sqlspec/builder/_vector_distance.py +19 -19
- sqlspec/config.py +145 -229
- sqlspec/core/__init__.py +18 -1
- sqlspec/core/_cursor.py +263 -0
- sqlspec/core/_operators.py +161 -0
- sqlspec/core/_ordering.py +151 -0
- sqlspec/core/_pagination.py +27 -3
- sqlspec/core/_pipeline.py +73 -73
- sqlspec/core/_pool.py +12 -12
- sqlspec/core/compiler.py +4 -10
- sqlspec/core/correlation.py +0 -1
- sqlspec/core/filters.py +407 -29
- sqlspec/core/hashing.py +28 -23
- sqlspec/core/parameters/__init__.py +4 -1
- sqlspec/core/parameters/_converter.py +389 -123
- sqlspec/core/parameters/_declared.py +5 -5
- sqlspec/core/parameters/_processor.py +302 -86
- sqlspec/core/parameters/_registry.py +36 -36
- sqlspec/core/parameters/_transformers.py +116 -116
- sqlspec/core/parameters/_types.py +29 -29
- sqlspec/core/parameters/_validator.py +113 -1
- sqlspec/core/query_modifiers.py +39 -28
- sqlspec/core/splitter.py +53 -53
- sqlspec/core/sqlcommenter.py +96 -96
- sqlspec/core/statement.py +127 -62
- sqlspec/data_dictionary/_registry.py +9 -9
- sqlspec/data_dictionary/_types.py +29 -29
- sqlspec/data_dictionary/dialects/mysql/config.py +32 -32
- sqlspec/dialects/postgres/_operators.py +17 -17
- sqlspec/dialects/spanner/_generators.py +0 -14
- sqlspec/dialects/spanner/_parsers.py +46 -46
- sqlspec/driver/__init__.py +8 -0
- sqlspec/driver/_async.py +0 -40
- sqlspec/driver/_common.py +94 -92
- sqlspec/driver/_exception_handler.py +32 -32
- sqlspec/driver/_stream.py +22 -27
- sqlspec/driver/_sync.py +1 -41
- sqlspec/exceptions.py +5 -5
- sqlspec/extensions/adk/artifact/service.py +0 -1
- sqlspec/extensions/adk/converters.py +0 -15
- sqlspec/extensions/adk/maintenance.py +74 -74
- sqlspec/extensions/adk/memory/converters.py +0 -2
- sqlspec/extensions/adk/service.py +0 -2
- sqlspec/extensions/events/__init__.py +96 -32
- sqlspec/extensions/events/_channel.py +29 -0
- sqlspec/extensions/events/_payload.py +19 -19
- sqlspec/extensions/events/_store.py +5 -3
- sqlspec/extensions/fastapi/providers.py +164 -26
- sqlspec/extensions/litestar/plugin.py +3 -5
- sqlspec/extensions/litestar/providers.py +183 -30
- sqlspec/extensions/litestar/store.py +0 -1
- sqlspec/extensions/starlette/extension.py +0 -2
- sqlspec/extensions/starlette/middleware.py +1 -1
- sqlspec/loader.py +12 -12
- sqlspec/migrations/__init__.py +72 -13
- sqlspec/migrations/base.py +42 -17
- sqlspec/migrations/commands.py +7 -7
- sqlspec/migrations/runner.py +7 -3
- sqlspec/migrations/schema.py +5 -1
- sqlspec/migrations/squash.py +0 -11
- sqlspec/migrations/tracker.py +24 -7
- sqlspec/migrations/version.py +9 -9
- sqlspec/observability/_observer.py +55 -55
- sqlspec/observability/_sampling.py +0 -3
- sqlspec/service/__init__.py +5 -0
- sqlspec/{service.py → service/_base.py} +386 -358
- sqlspec/service/_core.py +517 -0
- sqlspec/storage/_paths.py +33 -33
- sqlspec/storage/backends/base.py +19 -19
- sqlspec/storage/backends/fsspec.py +0 -1
- sqlspec/storage/backends/obstore.py +75 -75
- sqlspec/storage/errors.py +29 -29
- sqlspec/storage/pipeline.py +136 -136
- sqlspec/storage/registry.py +0 -3
- sqlspec/utils/config_tools.py +164 -75
- sqlspec/utils/correlation.py +6 -6
- sqlspec/utils/deprecation.py +13 -13
- sqlspec/utils/env.py +17 -17
- sqlspec/utils/module_loader.py +30 -39
- sqlspec/utils/schema.py +112 -127
- sqlspec/utils/serializers/_json.py +42 -45
- sqlspec/utils/serializers/_schema.py +92 -92
- sqlspec/utils/sync_tools.py +90 -90
- sqlspec/utils/type_converters.py +49 -49
- sqlspec/utils/type_guards.py +28 -34
- {sqlspec-0.63.0.dist-info → sqlspec-0.64.0.dist-info}/METADATA +5 -4
- {sqlspec-0.63.0.dist-info → sqlspec-0.64.0.dist-info}/RECORD +285 -280
- {sqlspec-0.63.0.dist-info → sqlspec-0.64.0.dist-info}/WHEEL +0 -0
- {sqlspec-0.63.0.dist-info → sqlspec-0.64.0.dist-info}/entry_points.txt +0 -0
- {sqlspec-0.63.0.dist-info → sqlspec-0.64.0.dist-info}/licenses/LICENSE +0 -0
sqlspec/__init__.py
CHANGED
|
@@ -13,79 +13,98 @@ _warnings.filterwarnings(
|
|
|
13
13
|
)
|
|
14
14
|
del _warnings
|
|
15
15
|
|
|
16
|
+
from importlib import import_module
|
|
17
|
+
from importlib.machinery import EXTENSION_SUFFIXES
|
|
16
18
|
from typing import TYPE_CHECKING, Any
|
|
17
19
|
|
|
18
|
-
from sqlspec import adapters, base, builder, core, driver, exceptions, extensions, loader, migrations, typing, utils
|
|
19
20
|
from sqlspec.__metadata__ import __version__
|
|
20
|
-
from sqlspec.
|
|
21
|
-
from sqlspec.builder import (
|
|
22
|
-
Column,
|
|
23
|
-
ColumnExpression,
|
|
24
|
-
CreateTable,
|
|
25
|
-
Delete,
|
|
26
|
-
DropTable,
|
|
27
|
-
FunctionColumn,
|
|
28
|
-
Insert,
|
|
29
|
-
Merge,
|
|
30
|
-
QueryBuilder,
|
|
31
|
-
Select,
|
|
32
|
-
SQLFactory,
|
|
33
|
-
Update,
|
|
34
|
-
sql,
|
|
35
|
-
)
|
|
36
|
-
from sqlspec.config import AsyncDatabaseConfig, SyncDatabaseConfig
|
|
37
|
-
from sqlspec.core import (
|
|
38
|
-
SQL,
|
|
39
|
-
ArrowResult,
|
|
40
|
-
CacheConfig,
|
|
41
|
-
CacheStats,
|
|
42
|
-
ParameterConverter,
|
|
43
|
-
ParameterDeclaration,
|
|
44
|
-
ParameterProcessor,
|
|
45
|
-
ParameterStyle,
|
|
46
|
-
ParameterStyleConfig,
|
|
47
|
-
ParamTypeMatcher,
|
|
48
|
-
ProcessedState,
|
|
49
|
-
SQLResult,
|
|
50
|
-
StackOperation,
|
|
51
|
-
StackResult,
|
|
52
|
-
Statement,
|
|
53
|
-
StatementConfig,
|
|
54
|
-
StatementStack,
|
|
55
|
-
matches_param_type,
|
|
56
|
-
register_param_type,
|
|
57
|
-
resolve_param_type,
|
|
58
|
-
)
|
|
59
|
-
from sqlspec.core import filters as filters
|
|
60
|
-
from sqlspec.driver import AsyncDriverAdapterBase, ExecutionResult, SyncDriverAdapterBase
|
|
61
|
-
from sqlspec.exceptions import StackExecutionError
|
|
62
|
-
from sqlspec.extensions.events import (
|
|
63
|
-
AsyncEventChannel,
|
|
64
|
-
AsyncEventListener,
|
|
65
|
-
EventMessage,
|
|
66
|
-
SyncEventChannel,
|
|
67
|
-
SyncEventListener,
|
|
68
|
-
)
|
|
69
|
-
from sqlspec.loader import SQLFile, SQLFileLoader
|
|
70
|
-
from sqlspec.observability import (
|
|
71
|
-
LoggingConfig,
|
|
72
|
-
ObservabilityConfig,
|
|
73
|
-
ObservabilityRuntime,
|
|
74
|
-
RedactionConfig,
|
|
75
|
-
StatementEvent,
|
|
76
|
-
StatementObserver,
|
|
77
|
-
TelemetryConfig,
|
|
78
|
-
create_event,
|
|
79
|
-
create_statement_observer,
|
|
80
|
-
default_statement_observer,
|
|
81
|
-
format_statement_event,
|
|
82
|
-
)
|
|
83
|
-
from sqlspec.typing import ConnectionT, PoolT, SchemaT, StatementParameters, SupportedSchemaModel
|
|
21
|
+
from sqlspec.utils import logging as _logging
|
|
84
22
|
from sqlspec.utils.logging import suppress_erroneous_sqlglot_log_messages
|
|
85
|
-
|
|
23
|
+
|
|
24
|
+
_COMPILED = (_logging.__file__ or "").endswith(tuple(EXTENSION_SUFFIXES))
|
|
86
25
|
|
|
87
26
|
if TYPE_CHECKING:
|
|
88
|
-
from sqlspec import
|
|
27
|
+
from sqlspec import (
|
|
28
|
+
adapters,
|
|
29
|
+
base,
|
|
30
|
+
builder,
|
|
31
|
+
core,
|
|
32
|
+
dialects,
|
|
33
|
+
driver,
|
|
34
|
+
exceptions,
|
|
35
|
+
extensions,
|
|
36
|
+
loader,
|
|
37
|
+
migrations,
|
|
38
|
+
typing,
|
|
39
|
+
utils,
|
|
40
|
+
)
|
|
41
|
+
from sqlspec import config as config
|
|
42
|
+
from sqlspec import observability as observability
|
|
43
|
+
from sqlspec.base import SQLSpec
|
|
44
|
+
from sqlspec.builder import (
|
|
45
|
+
Column,
|
|
46
|
+
ColumnExpression,
|
|
47
|
+
CreateTable,
|
|
48
|
+
Delete,
|
|
49
|
+
DropTable,
|
|
50
|
+
FunctionColumn,
|
|
51
|
+
Insert,
|
|
52
|
+
Merge,
|
|
53
|
+
QueryBuilder,
|
|
54
|
+
Select,
|
|
55
|
+
SQLFactory,
|
|
56
|
+
Update,
|
|
57
|
+
sql,
|
|
58
|
+
)
|
|
59
|
+
from sqlspec.config import AsyncDatabaseConfig, SyncDatabaseConfig
|
|
60
|
+
from sqlspec.core import (
|
|
61
|
+
SQL,
|
|
62
|
+
ArrowResult,
|
|
63
|
+
CacheConfig,
|
|
64
|
+
CacheStats,
|
|
65
|
+
ParameterConverter,
|
|
66
|
+
ParameterDeclaration,
|
|
67
|
+
ParameterProcessor,
|
|
68
|
+
ParameterStyle,
|
|
69
|
+
ParameterStyleConfig,
|
|
70
|
+
ParamTypeMatcher,
|
|
71
|
+
ProcessedState,
|
|
72
|
+
SQLResult,
|
|
73
|
+
StackOperation,
|
|
74
|
+
StackResult,
|
|
75
|
+
Statement,
|
|
76
|
+
StatementConfig,
|
|
77
|
+
StatementStack,
|
|
78
|
+
matches_param_type,
|
|
79
|
+
register_param_type,
|
|
80
|
+
resolve_param_type,
|
|
81
|
+
)
|
|
82
|
+
from sqlspec.core import filters as filters
|
|
83
|
+
from sqlspec.driver import AsyncDriverAdapterBase, ExecutionResult, SyncDriverAdapterBase
|
|
84
|
+
from sqlspec.exceptions import StackExecutionError
|
|
85
|
+
from sqlspec.extensions.events import (
|
|
86
|
+
AsyncEventChannel,
|
|
87
|
+
AsyncEventListener,
|
|
88
|
+
EventMessage,
|
|
89
|
+
SyncEventChannel,
|
|
90
|
+
SyncEventListener,
|
|
91
|
+
)
|
|
92
|
+
from sqlspec.loader import SQLFile, SQLFileLoader
|
|
93
|
+
from sqlspec.observability import (
|
|
94
|
+
LoggingConfig,
|
|
95
|
+
ObservabilityConfig,
|
|
96
|
+
ObservabilityRuntime,
|
|
97
|
+
RedactionConfig,
|
|
98
|
+
StatementEvent,
|
|
99
|
+
StatementObserver,
|
|
100
|
+
TelemetryConfig,
|
|
101
|
+
create_event,
|
|
102
|
+
create_statement_observer,
|
|
103
|
+
default_statement_observer,
|
|
104
|
+
format_statement_event,
|
|
105
|
+
)
|
|
106
|
+
from sqlspec.typing import ConnectionT, PoolT, SchemaT, StatementParameters, SupportedSchemaModel
|
|
107
|
+
from sqlspec.utils.uuids import nanoid, uuid4, uuid6, uuid7
|
|
89
108
|
|
|
90
109
|
__all__ = (
|
|
91
110
|
"SQL",
|
|
@@ -174,10 +193,111 @@ __all__ = (
|
|
|
174
193
|
suppress_erroneous_sqlglot_log_messages()
|
|
175
194
|
|
|
176
195
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
196
|
+
_EXPORTS: dict[str, tuple[str, str | None]] = {
|
|
197
|
+
"ArrowResult": ("sqlspec.core", "ArrowResult"),
|
|
198
|
+
"AsyncDatabaseConfig": ("sqlspec.config", "AsyncDatabaseConfig"),
|
|
199
|
+
"AsyncDriverAdapterBase": ("sqlspec.driver", "AsyncDriverAdapterBase"),
|
|
200
|
+
"AsyncEventChannel": ("sqlspec.extensions.events", "AsyncEventChannel"),
|
|
201
|
+
"AsyncEventListener": ("sqlspec.extensions.events", "AsyncEventListener"),
|
|
202
|
+
"CacheConfig": ("sqlspec.core", "CacheConfig"),
|
|
203
|
+
"CacheStats": ("sqlspec.core", "CacheStats"),
|
|
204
|
+
"Column": ("sqlspec.builder", "Column"),
|
|
205
|
+
"ColumnExpression": ("sqlspec.builder", "ColumnExpression"),
|
|
206
|
+
"ConnectionT": ("sqlspec.typing", "ConnectionT"),
|
|
207
|
+
"CreateTable": ("sqlspec.builder", "CreateTable"),
|
|
208
|
+
"Delete": ("sqlspec.builder", "Delete"),
|
|
209
|
+
"DropTable": ("sqlspec.builder", "DropTable"),
|
|
210
|
+
"EventMessage": ("sqlspec.extensions.events", "EventMessage"),
|
|
211
|
+
"ExecutionResult": ("sqlspec.driver", "ExecutionResult"),
|
|
212
|
+
"FunctionColumn": ("sqlspec.builder", "FunctionColumn"),
|
|
213
|
+
"Insert": ("sqlspec.builder", "Insert"),
|
|
214
|
+
"LoggingConfig": ("sqlspec.observability", "LoggingConfig"),
|
|
215
|
+
"Merge": ("sqlspec.builder", "Merge"),
|
|
216
|
+
"ObservabilityConfig": ("sqlspec.observability", "ObservabilityConfig"),
|
|
217
|
+
"ObservabilityRuntime": ("sqlspec.observability", "ObservabilityRuntime"),
|
|
218
|
+
"ParamTypeMatcher": ("sqlspec.core", "ParamTypeMatcher"),
|
|
219
|
+
"ParameterConverter": ("sqlspec.core", "ParameterConverter"),
|
|
220
|
+
"ParameterDeclaration": ("sqlspec.core", "ParameterDeclaration"),
|
|
221
|
+
"ParameterProcessor": ("sqlspec.core", "ParameterProcessor"),
|
|
222
|
+
"ParameterStyle": ("sqlspec.core", "ParameterStyle"),
|
|
223
|
+
"ParameterStyleConfig": ("sqlspec.core", "ParameterStyleConfig"),
|
|
224
|
+
"PoolT": ("sqlspec.typing", "PoolT"),
|
|
225
|
+
"ProcessedState": ("sqlspec.core", "ProcessedState"),
|
|
226
|
+
"QueryBuilder": ("sqlspec.builder", "QueryBuilder"),
|
|
227
|
+
"RedactionConfig": ("sqlspec.observability", "RedactionConfig"),
|
|
228
|
+
"SQL": ("sqlspec.core", "SQL"),
|
|
229
|
+
"SQLFactory": ("sqlspec.builder", "SQLFactory"),
|
|
230
|
+
"SQLFile": ("sqlspec.loader", "SQLFile"),
|
|
231
|
+
"SQLFileLoader": ("sqlspec.loader", "SQLFileLoader"),
|
|
232
|
+
"SQLResult": ("sqlspec.core", "SQLResult"),
|
|
233
|
+
"SQLSpec": ("sqlspec.base", "SQLSpec"),
|
|
234
|
+
"SchemaT": ("sqlspec.typing", "SchemaT"),
|
|
235
|
+
"Select": ("sqlspec.builder", "Select"),
|
|
236
|
+
"StackExecutionError": ("sqlspec.exceptions", "StackExecutionError"),
|
|
237
|
+
"StackOperation": ("sqlspec.core", "StackOperation"),
|
|
238
|
+
"StackResult": ("sqlspec.core", "StackResult"),
|
|
239
|
+
"Statement": ("sqlspec.core", "Statement"),
|
|
240
|
+
"StatementConfig": ("sqlspec.core", "StatementConfig"),
|
|
241
|
+
"StatementEvent": ("sqlspec.observability", "StatementEvent"),
|
|
242
|
+
"StatementObserver": ("sqlspec.observability", "StatementObserver"),
|
|
243
|
+
"StatementParameters": ("sqlspec.typing", "StatementParameters"),
|
|
244
|
+
"StatementStack": ("sqlspec.core", "StatementStack"),
|
|
245
|
+
"SupportedSchemaModel": ("sqlspec.typing", "SupportedSchemaModel"),
|
|
246
|
+
"SyncDatabaseConfig": ("sqlspec.config", "SyncDatabaseConfig"),
|
|
247
|
+
"SyncDriverAdapterBase": ("sqlspec.driver", "SyncDriverAdapterBase"),
|
|
248
|
+
"SyncEventChannel": ("sqlspec.extensions.events", "SyncEventChannel"),
|
|
249
|
+
"SyncEventListener": ("sqlspec.extensions.events", "SyncEventListener"),
|
|
250
|
+
"TelemetryConfig": ("sqlspec.observability", "TelemetryConfig"),
|
|
251
|
+
"Update": ("sqlspec.builder", "Update"),
|
|
252
|
+
"adapters": ("sqlspec.adapters", None),
|
|
253
|
+
"base": ("sqlspec.base", None),
|
|
254
|
+
"builder": ("sqlspec.builder", None),
|
|
255
|
+
"config": ("sqlspec.config", None),
|
|
256
|
+
"core": ("sqlspec.core", None),
|
|
257
|
+
"create_event": ("sqlspec.observability", "create_event"),
|
|
258
|
+
"create_statement_observer": ("sqlspec.observability", "create_statement_observer"),
|
|
259
|
+
"default_statement_observer": ("sqlspec.observability", "default_statement_observer"),
|
|
260
|
+
"dialects": ("sqlspec.dialects", None),
|
|
261
|
+
"driver": ("sqlspec.driver", None),
|
|
262
|
+
"exceptions": ("sqlspec.exceptions", None),
|
|
263
|
+
"extensions": ("sqlspec.extensions", None),
|
|
264
|
+
"filters": ("sqlspec.core", "filters"),
|
|
265
|
+
"format_statement_event": ("sqlspec.observability", "format_statement_event"),
|
|
266
|
+
"loader": ("sqlspec.loader", None),
|
|
267
|
+
"matches_param_type": ("sqlspec.core", "matches_param_type"),
|
|
268
|
+
"migrations": ("sqlspec.migrations", None),
|
|
269
|
+
"nanoid": ("sqlspec.utils.uuids", "nanoid"),
|
|
270
|
+
"observability": ("sqlspec.observability", None),
|
|
271
|
+
"register_param_type": ("sqlspec.core", "register_param_type"),
|
|
272
|
+
"resolve_param_type": ("sqlspec.core", "resolve_param_type"),
|
|
273
|
+
"sql": ("sqlspec.builder._factory", "sql"),
|
|
274
|
+
"typing": ("sqlspec.typing", None),
|
|
275
|
+
"utils": ("sqlspec.utils", None),
|
|
276
|
+
"uuid4": ("sqlspec.utils.uuids", "uuid4"),
|
|
277
|
+
"uuid6": ("sqlspec.utils.uuids", "uuid6"),
|
|
278
|
+
"uuid7": ("sqlspec.utils.uuids", "uuid7"),
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def __getattr__(name: str) -> Any:
|
|
283
|
+
target = _EXPORTS.get(name)
|
|
284
|
+
if target is None:
|
|
285
|
+
msg = f"module {__name__!r} has no attribute {name!r}"
|
|
286
|
+
raise AttributeError(msg)
|
|
287
|
+
module_name, attribute = target
|
|
288
|
+
module = import_module(module_name)
|
|
289
|
+
value = module if attribute is None else getattr(module, attribute)
|
|
290
|
+
globals()[name] = value
|
|
291
|
+
return value
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def __dir__() -> list[str]:
|
|
295
|
+
return sorted(set(globals()) | _EXPORTS.keys())
|
|
296
|
+
|
|
180
297
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
298
|
+
# Native cross-module initialization is not protected by Python import locks.
|
|
299
|
+
# Retain eager exports in compiled wheels until mypyc supports lazy concurrency.
|
|
300
|
+
if _COMPILED:
|
|
301
|
+
for _name in __all__:
|
|
302
|
+
if _name not in globals():
|
|
303
|
+
__getattr__(_name)
|
sqlspec/_typing.py
CHANGED
|
@@ -336,10 +336,6 @@ def attrs_define_stub(*args: Any, **kwargs: Any) -> Any: # noqa: ARG001
|
|
|
336
336
|
return _attrs_define_identity
|
|
337
337
|
|
|
338
338
|
|
|
339
|
-
def _attrs_define_identity(cls: Any) -> Any:
|
|
340
|
-
return cls
|
|
341
|
-
|
|
342
|
-
|
|
343
339
|
def attrs_field_stub(*args: Any, **kwargs: Any) -> Any: # noqa: ARG001
|
|
344
340
|
"""Placeholder implementation"""
|
|
345
341
|
return None
|
|
@@ -751,3 +747,7 @@ def __dir__() -> "list[str]":
|
|
|
751
747
|
"""Expose the public surface for autocomplete and ``dir()``."""
|
|
752
748
|
|
|
753
749
|
return sorted(set(globals()) | set(__all__))
|
|
750
|
+
|
|
751
|
+
|
|
752
|
+
def _attrs_define_identity(cls: Any) -> Any:
|
|
753
|
+
return cls
|
sqlspec/adapters/adbc/_typing.py
CHANGED
|
@@ -9,9 +9,13 @@ import contextlib
|
|
|
9
9
|
from typing import TYPE_CHECKING, Any
|
|
10
10
|
|
|
11
11
|
from adbc_driver_manager import Error as _AdbcNativeError
|
|
12
|
+
from adbc_driver_manager import NotSupportedError as AdbcNotSupportedError
|
|
13
|
+
from adbc_driver_manager import OperationalError as AdbcOperationalError
|
|
12
14
|
from adbc_driver_manager.dbapi import Connection
|
|
13
15
|
from adbc_driver_manager.dbapi import Cursor as _AdbcRawCursor
|
|
14
16
|
|
|
17
|
+
from sqlspec.typing import import_optional_attr
|
|
18
|
+
|
|
15
19
|
_AdbcConnection = Connection
|
|
16
20
|
|
|
17
21
|
if TYPE_CHECKING:
|
|
@@ -19,6 +23,8 @@ if TYPE_CHECKING:
|
|
|
19
23
|
from types import TracebackType
|
|
20
24
|
from typing import TypeAlias
|
|
21
25
|
|
|
26
|
+
from adbc_driver_flightsql import DatabaseOptions as AdbcFlightSqlDatabaseOptions
|
|
27
|
+
|
|
22
28
|
from sqlspec.adapters.adbc.driver import AdbcDriver
|
|
23
29
|
from sqlspec.core import StatementConfig
|
|
24
30
|
|
|
@@ -31,7 +37,16 @@ if not TYPE_CHECKING:
|
|
|
31
37
|
AdbcRawCursor = _AdbcRawCursor
|
|
32
38
|
AdbcNativeError = _AdbcNativeError
|
|
33
39
|
|
|
34
|
-
__all__ = (
|
|
40
|
+
__all__ = (
|
|
41
|
+
"AdbcConnection",
|
|
42
|
+
"AdbcCursor",
|
|
43
|
+
"AdbcFlightSqlDatabaseOptions",
|
|
44
|
+
"AdbcNativeError",
|
|
45
|
+
"AdbcNotSupportedError",
|
|
46
|
+
"AdbcOperationalError",
|
|
47
|
+
"AdbcRawCursor",
|
|
48
|
+
"AdbcSessionContext",
|
|
49
|
+
)
|
|
35
50
|
|
|
36
51
|
|
|
37
52
|
class AdbcCursor:
|
|
@@ -77,7 +92,7 @@ class AdbcSessionContext:
|
|
|
77
92
|
def __init__(
|
|
78
93
|
self,
|
|
79
94
|
acquire_connection: "Callable[[], Any]",
|
|
80
|
-
release_connection: "Callable[
|
|
95
|
+
release_connection: "Callable[..., Any]",
|
|
81
96
|
statement_config: "StatementConfig",
|
|
82
97
|
driver_features: "dict[str, Any]",
|
|
83
98
|
prepare_driver: "Callable[[AdbcDriver], AdbcDriver]",
|
|
@@ -108,6 +123,18 @@ class AdbcSessionContext:
|
|
|
108
123
|
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: "TracebackType | None"
|
|
109
124
|
) -> "bool | None":
|
|
110
125
|
if self._connection is not None:
|
|
111
|
-
self._release_connection(self._connection)
|
|
126
|
+
self._release_connection(self._connection, exc_type=exc_type, exc_val=exc_val, exc_tb=exc_tb)
|
|
112
127
|
self._connection = None
|
|
113
128
|
return None
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def __getattr__(name: str) -> Any:
|
|
132
|
+
"""Load Flight SQL options only when that optional driver is used."""
|
|
133
|
+
if name != "AdbcFlightSqlDatabaseOptions":
|
|
134
|
+
msg = f"module {__name__!r} has no attribute {name!r}"
|
|
135
|
+
raise AttributeError(msg)
|
|
136
|
+
value = import_optional_attr("adbc_driver_flightsql", "DatabaseOptions")
|
|
137
|
+
if value is None:
|
|
138
|
+
msg = "Cannot import DatabaseOptions from adbc_driver_flightsql"
|
|
139
|
+
raise ImportError(msg)
|
|
140
|
+
return value
|
sqlspec/adapters/adbc/config.py
CHANGED
|
@@ -25,7 +25,7 @@ from sqlspec.core.config_runtime import (
|
|
|
25
25
|
resolve_postgres_extension_state,
|
|
26
26
|
resolve_runtime_statement_config,
|
|
27
27
|
)
|
|
28
|
-
from sqlspec.driver
|
|
28
|
+
from sqlspec.driver import SyncPoolConnectionContext, SyncPoolSessionFactory
|
|
29
29
|
from sqlspec.exceptions import ImproperConfigurationError
|
|
30
30
|
from sqlspec.extensions.events import EventRuntimeHints
|
|
31
31
|
from sqlspec.utils.config_tools import normalize_connection_config
|
|
@@ -44,6 +44,11 @@ class AdbcConnectionParams(TypedDict):
|
|
|
44
44
|
"""ADBC connection parameters."""
|
|
45
45
|
|
|
46
46
|
uri: NotRequired[str]
|
|
47
|
+
dsn: NotRequired[str]
|
|
48
|
+
url: NotRequired[str]
|
|
49
|
+
connection_string: NotRequired[str]
|
|
50
|
+
db: NotRequired[str]
|
|
51
|
+
path: NotRequired[str]
|
|
47
52
|
driver_name: NotRequired[str]
|
|
48
53
|
db_kwargs: NotRequired[dict[str, Any]]
|
|
49
54
|
conn_kwargs: NotRequired[dict[str, Any]]
|
|
@@ -241,7 +246,41 @@ class AdbcConfig(NoPoolSyncConfig[AdbcConnection, AdbcDriver]):
|
|
|
241
246
|
observability_config: Adapter-level observability overrides for lifecycle hooks and observers
|
|
242
247
|
**kwargs: Additional keyword arguments passed to the base configuration.
|
|
243
248
|
"""
|
|
244
|
-
|
|
249
|
+
config_dict = normalize_connection_config(connection_config)
|
|
250
|
+
if "uri" not in config_dict:
|
|
251
|
+
uri = (
|
|
252
|
+
config_dict.pop("url", None)
|
|
253
|
+
or config_dict.pop("dsn", None)
|
|
254
|
+
or config_dict.pop("connection_string", None)
|
|
255
|
+
)
|
|
256
|
+
if uri is not None:
|
|
257
|
+
config_dict["uri"] = uri
|
|
258
|
+
else:
|
|
259
|
+
config_dict.pop("url", None)
|
|
260
|
+
config_dict.pop("dsn", None)
|
|
261
|
+
config_dict.pop("connection_string", None)
|
|
262
|
+
|
|
263
|
+
driver_name = config_dict.get("driver_name")
|
|
264
|
+
if (driver_name in {"sqlite", "adbc_driver_sqlite"} or driver_name is None) and "uri" not in config_dict:
|
|
265
|
+
db_path = (
|
|
266
|
+
config_dict.pop("database", None)
|
|
267
|
+
or config_dict.pop("db", None)
|
|
268
|
+
or config_dict.pop("path", None)
|
|
269
|
+
or config_dict.pop("file", None)
|
|
270
|
+
)
|
|
271
|
+
if db_path is not None:
|
|
272
|
+
config_dict["uri"] = db_path
|
|
273
|
+
elif driver_name in {"duckdb", "adbc_driver_duckdb"} and "path" not in config_dict:
|
|
274
|
+
duck_path = (
|
|
275
|
+
config_dict.pop("database", None)
|
|
276
|
+
or config_dict.pop("db", None)
|
|
277
|
+
or config_dict.pop("file", None)
|
|
278
|
+
or config_dict.pop("path", None)
|
|
279
|
+
)
|
|
280
|
+
if duck_path is not None:
|
|
281
|
+
config_dict["path"] = duck_path
|
|
282
|
+
|
|
283
|
+
self.connection_config = config_dict
|
|
245
284
|
self._pgvector_available: bool | None = None
|
|
246
285
|
self._paradedb_available: bool | None = None
|
|
247
286
|
self._pg_textsearch_available: bool | None = None
|
sqlspec/adapters/adbc/core.py
CHANGED
|
@@ -76,6 +76,7 @@ __all__ = (
|
|
|
76
76
|
"handle_postgres_rollback",
|
|
77
77
|
"is_postgres_dialect",
|
|
78
78
|
"is_postgres_extension_active",
|
|
79
|
+
"is_shared_object_driver",
|
|
79
80
|
"normalize_driver_path",
|
|
80
81
|
"normalize_postgres_empty_parameters",
|
|
81
82
|
"normalize_script_rowcount",
|
|
@@ -170,7 +171,13 @@ _PARAMETER_STYLES_BY_KEYWORD: "tuple[tuple[str, tuple[tuple[str, ...], str]], ..
|
|
|
170
171
|
("snowflake", (("qmark", "numeric"), "qmark")),
|
|
171
172
|
)
|
|
172
173
|
|
|
173
|
-
|
|
174
|
+
_BIGQUERY_DB_KWARGS_OPTIONS: "tuple[tuple[str, str], ...]" = (
|
|
175
|
+
("project_id", "adbc.bigquery.sql.project_id"),
|
|
176
|
+
("dataset_id", "adbc.bigquery.sql.dataset_id"),
|
|
177
|
+
("token", "adbc.bigquery.sql.auth.refresh_token"),
|
|
178
|
+
)
|
|
179
|
+
_SHARED_OBJECT_SUFFIXES: "tuple[str, ...]" = (".so", ".dylib", ".dll")
|
|
180
|
+
_DRIVER_MANAGER_CONNECT: Final[str] = "adbc_driver_manager.dbapi.connect"
|
|
174
181
|
_FLIGHTSQL_DB_KWARGS_FIELDS: "tuple[str, ...]" = ("username", "password")
|
|
175
182
|
_FLIGHTSQL_TLS_SKIP_VERIFY_KEY: Final[str] = "adbc.flight.sql.client_option.tls_skip_verify"
|
|
176
183
|
_FLIGHTSQL_AUTHORIZATION_HEADER_KEY: Final[str] = "adbc.flight.sql.authorization_header"
|
|
@@ -273,9 +280,27 @@ def detect_postgres_extensions(
|
|
|
273
280
|
return False, False, False
|
|
274
281
|
|
|
275
282
|
|
|
283
|
+
def is_shared_object_driver(driver_name: str) -> bool:
|
|
284
|
+
"""Return whether a driver name points at a shared library rather than a module.
|
|
285
|
+
|
|
286
|
+
Args:
|
|
287
|
+
driver_name: Raw driver name or path from configuration.
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
True when the value is a filesystem path to a driver shared object.
|
|
291
|
+
"""
|
|
292
|
+
stripped = driver_name.strip()
|
|
293
|
+
if not stripped:
|
|
294
|
+
return False
|
|
295
|
+
lowered = stripped.lower()
|
|
296
|
+
return lowered.endswith(_SHARED_OBJECT_SUFFIXES) or "/" in stripped or "\\" in stripped
|
|
297
|
+
|
|
298
|
+
|
|
276
299
|
def normalize_driver_path(driver_name: str) -> str:
|
|
277
300
|
"""Normalize a driver name to an importable connect function path."""
|
|
278
301
|
stripped = driver_name.strip()
|
|
302
|
+
if is_shared_object_driver(stripped):
|
|
303
|
+
return _DRIVER_MANAGER_CONNECT
|
|
279
304
|
if stripped.endswith(".dbapi.connect"):
|
|
280
305
|
return stripped
|
|
281
306
|
if stripped.endswith(".dbapi"):
|
|
@@ -320,6 +345,8 @@ def driver_kind_from_uri(uri: str) -> "str | None":
|
|
|
320
345
|
def resolve_driver_name(driver_name: str | None, uri: str | None) -> str:
|
|
321
346
|
"""Resolve and normalize the driver name."""
|
|
322
347
|
if isinstance(driver_name, str):
|
|
348
|
+
if is_shared_object_driver(driver_name):
|
|
349
|
+
return _DRIVER_MANAGER_CONNECT
|
|
323
350
|
lowered_driver = driver_name.lower()
|
|
324
351
|
alias = _DRIVER_ALIASES.get(lowered_driver)
|
|
325
352
|
if alias is not None:
|
|
@@ -336,7 +363,13 @@ def resolve_driver_name(driver_name: str | None, uri: str | None) -> str:
|
|
|
336
363
|
|
|
337
364
|
def resolve_driver_name_from_config(connection_config: "Mapping[str, Any]") -> str:
|
|
338
365
|
"""Resolve and normalize the driver name from a connection config mapping."""
|
|
339
|
-
|
|
366
|
+
uri = (
|
|
367
|
+
connection_config.get("uri")
|
|
368
|
+
or connection_config.get("url")
|
|
369
|
+
or connection_config.get("dsn")
|
|
370
|
+
or connection_config.get("connection_string")
|
|
371
|
+
)
|
|
372
|
+
return resolve_driver_name(connection_config.get("driver_name"), uri)
|
|
340
373
|
|
|
341
374
|
|
|
342
375
|
def resolve_driver_connect_func(driver_name: str | None, uri: str | None) -> "Callable[..., Any]":
|
|
@@ -360,9 +393,14 @@ def resolve_driver_connect_func(driver_name: str | None, uri: str | None) -> "Ca
|
|
|
360
393
|
|
|
361
394
|
|
|
362
395
|
def resolve_dialect_from_driver_path(driver_path: str) -> str:
|
|
363
|
-
"""Get the SQL dialect type based on the driver path.
|
|
396
|
+
"""Get the SQL dialect type based on the driver path.
|
|
397
|
+
|
|
398
|
+
Only the final path segment is considered, because a directory on the way to
|
|
399
|
+
the driver can carry the name of an unrelated database.
|
|
400
|
+
"""
|
|
401
|
+
candidate = driver_path.replace("\\", "/").rsplit("/", 1)[-1] or driver_path
|
|
364
402
|
for keyword, dialect in _DRIVER_PATH_KEYWORDS_TO_DIALECT:
|
|
365
|
-
if keyword in
|
|
403
|
+
if keyword in candidate:
|
|
366
404
|
return dialect
|
|
367
405
|
return "sqlite"
|
|
368
406
|
|
|
@@ -382,7 +420,15 @@ def resolve_dialect_from_config(connection_config: "Mapping[str, Any]") -> str:
|
|
|
382
420
|
if isinstance(driver_name, str) and driver_name.lower() in {"gizmosql", "gizmo"}:
|
|
383
421
|
return "duckdb"
|
|
384
422
|
|
|
385
|
-
|
|
423
|
+
if isinstance(driver_name, str) and is_shared_object_driver(driver_name):
|
|
424
|
+
return resolve_dialect_from_driver_path(driver_name.lower())
|
|
425
|
+
|
|
426
|
+
uri = (
|
|
427
|
+
connection_config.get("uri")
|
|
428
|
+
or connection_config.get("url")
|
|
429
|
+
or connection_config.get("dsn")
|
|
430
|
+
or connection_config.get("connection_string")
|
|
431
|
+
)
|
|
386
432
|
if isinstance(uri, str):
|
|
387
433
|
lowered_uri = uri.lower()
|
|
388
434
|
if lowered_uri.startswith(("gizmosql://", "gizmo://", "grpc+tls://")):
|
|
@@ -422,6 +468,15 @@ def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str
|
|
|
422
468
|
"""
|
|
423
469
|
config = dict(connection_config)
|
|
424
470
|
|
|
471
|
+
if "uri" not in config:
|
|
472
|
+
uri_alias = config.pop("url", None) or config.pop("dsn", None) or config.pop("connection_string", None)
|
|
473
|
+
if uri_alias is not None:
|
|
474
|
+
config["uri"] = uri_alias
|
|
475
|
+
else:
|
|
476
|
+
config.pop("url", None)
|
|
477
|
+
config.pop("dsn", None)
|
|
478
|
+
config.pop("connection_string", None)
|
|
479
|
+
|
|
425
480
|
driver_name = config.get("driver_name")
|
|
426
481
|
uri = config.get("uri")
|
|
427
482
|
driver_kind: str | None = None
|
|
@@ -430,6 +485,29 @@ def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str
|
|
|
430
485
|
if driver_kind is None and isinstance(uri, str):
|
|
431
486
|
driver_kind = driver_kind_from_uri(uri)
|
|
432
487
|
|
|
488
|
+
if (driver_kind == "sqlite" or driver_kind is None) and "uri" not in config:
|
|
489
|
+
db_path = (
|
|
490
|
+
config.pop("database", None)
|
|
491
|
+
or config.pop("db", None)
|
|
492
|
+
or config.pop("path", None)
|
|
493
|
+
or config.pop("file", None)
|
|
494
|
+
)
|
|
495
|
+
if db_path is not None:
|
|
496
|
+
config["uri"] = db_path
|
|
497
|
+
uri = db_path
|
|
498
|
+
if driver_kind is None:
|
|
499
|
+
driver_kind = "sqlite"
|
|
500
|
+
|
|
501
|
+
if driver_kind == "duckdb" and "path" not in config:
|
|
502
|
+
duck_path = (
|
|
503
|
+
config.pop("database", None)
|
|
504
|
+
or config.pop("db", None)
|
|
505
|
+
or config.pop("file", None)
|
|
506
|
+
or config.pop("path", None)
|
|
507
|
+
)
|
|
508
|
+
if duck_path is not None:
|
|
509
|
+
config["path"] = duck_path
|
|
510
|
+
|
|
433
511
|
if isinstance(uri, str) and driver_kind == "sqlite" and uri.startswith("sqlite://"):
|
|
434
512
|
config["uri"] = uri[9:]
|
|
435
513
|
if isinstance(uri, str) and driver_kind == "duckdb" and uri.startswith("duckdb://"):
|
|
@@ -440,18 +518,29 @@ def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str
|
|
|
440
518
|
if legacy_entrypoint is not None:
|
|
441
519
|
config.setdefault("entrypoint", legacy_entrypoint)
|
|
442
520
|
|
|
521
|
+
uses_driver_manager = (
|
|
522
|
+
resolve_driver_name(
|
|
523
|
+
driver_name if isinstance(driver_name, str) else None, uri if isinstance(uri, str) else None
|
|
524
|
+
)
|
|
525
|
+
== _DRIVER_MANAGER_CONNECT
|
|
526
|
+
)
|
|
527
|
+
if not uses_driver_manager:
|
|
528
|
+
config.pop("entrypoint", None)
|
|
529
|
+
|
|
443
530
|
if driver_kind in {"gizmosql", "flightsql"}:
|
|
444
531
|
_lift_flightsql_db_kwargs(config)
|
|
445
532
|
elif driver_kind == "bigquery":
|
|
446
533
|
db_kwargs = config.get("db_kwargs")
|
|
447
534
|
db_kwargs_dict: dict[str, Any] = dict(db_kwargs) if isinstance(db_kwargs, dict) else {}
|
|
448
|
-
for param in
|
|
535
|
+
for param, option in _BIGQUERY_DB_KWARGS_OPTIONS:
|
|
449
536
|
if param in config:
|
|
450
|
-
db_kwargs_dict[
|
|
537
|
+
db_kwargs_dict[option] = config.pop(param)
|
|
451
538
|
if db_kwargs_dict:
|
|
452
539
|
config["db_kwargs"] = db_kwargs_dict
|
|
453
540
|
|
|
454
541
|
config.pop("driver_name", None)
|
|
542
|
+
if uses_driver_manager and isinstance(driver_name, str) and "driver" not in config:
|
|
543
|
+
config["driver"] = driver_name.strip()
|
|
455
544
|
|
|
456
545
|
return config
|
|
457
546
|
|
|
@@ -1299,7 +1388,7 @@ def _prepare_batch_with_casts(
|
|
|
1299
1388
|
|
|
1300
1389
|
def _resolve_flightsql_db_kwargs_keys() -> "tuple[str, str]":
|
|
1301
1390
|
try:
|
|
1302
|
-
from
|
|
1391
|
+
from sqlspec.adapters.adbc._typing import AdbcFlightSqlDatabaseOptions as DatabaseOptions
|
|
1303
1392
|
except ImportError:
|
|
1304
1393
|
return _FLIGHTSQL_TLS_SKIP_VERIFY_KEY, _FLIGHTSQL_AUTHORIZATION_HEADER_KEY
|
|
1305
1394
|
return DatabaseOptions.TLS_SKIP_VERIFY.value, DatabaseOptions.AUTHORIZATION_HEADER.value
|