sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.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.
- ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/__init__.py +140 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_serialization.py +315 -0
- sqlspec/_typing.py +700 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +5 -0
- sqlspec/adapters/adbc/_typing.py +82 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1273 -0
- sqlspec/adapters/adbc/config.py +295 -0
- sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/core.py +735 -0
- sqlspec/adapters/adbc/data_dictionary.py +334 -0
- sqlspec/adapters/adbc/driver.py +529 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +502 -0
- sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/type_converter.py +140 -0
- sqlspec/adapters/aiosqlite/__init__.py +25 -0
- sqlspec/adapters/aiosqlite/_typing.py +82 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +818 -0
- sqlspec/adapters/aiosqlite/config.py +334 -0
- sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
- sqlspec/adapters/aiosqlite/driver.py +313 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.py +533 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +87 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +703 -0
- sqlspec/adapters/asyncmy/config.py +302 -0
- sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncmy/core.py +360 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
- sqlspec/adapters/asyncmy/driver.py +383 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +19 -0
- sqlspec/adapters/asyncpg/_typing.py +88 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +748 -0
- sqlspec/adapters/asyncpg/config.py +569 -0
- sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncpg/core.py +367 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/backend.py +286 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +14 -0
- sqlspec/adapters/bigquery/_typing.py +86 -0
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +827 -0
- sqlspec/adapters/bigquery/config.py +353 -0
- sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/core.py +715 -0
- sqlspec/adapters/bigquery/data_dictionary.py +128 -0
- sqlspec/adapters/bigquery/driver.py +548 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
- sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
- sqlspec/adapters/cockroach_psycopg/config.py +484 -0
- sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
- sqlspec/adapters/duckdb/__init__.py +25 -0
- sqlspec/adapters/duckdb/_typing.py +81 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +850 -0
- sqlspec/adapters/duckdb/config.py +463 -0
- sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/core.py +257 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +430 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.py +293 -0
- sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mock/__init__.py +72 -0
- sqlspec/adapters/mock/_typing.py +147 -0
- sqlspec/adapters/mock/config.py +483 -0
- sqlspec/adapters/mock/core.py +319 -0
- sqlspec/adapters/mock/data_dictionary.py +366 -0
- sqlspec/adapters/mock/driver.py +721 -0
- sqlspec/adapters/mysqlconnector/__init__.py +36 -0
- sqlspec/adapters/mysqlconnector/_typing.py +141 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
- sqlspec/adapters/mysqlconnector/config.py +394 -0
- sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/mysqlconnector/core.py +303 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
- sqlspec/adapters/mysqlconnector/driver.py +483 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +60 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
- sqlspec/adapters/oracledb/_typing.py +182 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
- sqlspec/adapters/oracledb/adk/__init__.py +10 -0
- sqlspec/adapters/oracledb/adk/store.py +2369 -0
- sqlspec/adapters/oracledb/config.py +550 -0
- sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/core.py +543 -0
- sqlspec/adapters/oracledb/data_dictionary.py +536 -0
- sqlspec/adapters/oracledb/driver.py +1229 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/backend.py +347 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +535 -0
- sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +17 -0
- sqlspec/adapters/psqlpy/_typing.py +79 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +766 -0
- sqlspec/adapters/psqlpy/config.py +304 -0
- sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/core.py +480 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
- sqlspec/adapters/psqlpy/driver.py +438 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/backend.py +310 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +32 -0
- sqlspec/adapters/psycopg/_typing.py +164 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1387 -0
- sqlspec/adapters/psycopg/config.py +576 -0
- sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/core.py +450 -0
- sqlspec/adapters/psycopg/data_dictionary.py +289 -0
- sqlspec/adapters/psycopg/driver.py +975 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/backend.py +458 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +552 -0
- sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +71 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +540 -0
- sqlspec/adapters/pymysql/config.py +195 -0
- sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/pymysql/core.py +299 -0
- sqlspec/adapters/pymysql/data_dictionary.py +122 -0
- sqlspec/adapters/pymysql/driver.py +259 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.py +137 -0
- sqlspec/adapters/spanner/__init__.py +40 -0
- sqlspec/adapters/spanner/_typing.py +86 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +732 -0
- sqlspec/adapters/spanner/config.py +352 -0
- sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/core.py +188 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/dialect/__init__.py +6 -0
- sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
- sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
- sqlspec/adapters/spanner/driver.py +373 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/type_converter.py +331 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +80 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +958 -0
- sqlspec/adapters/sqlite/config.py +280 -0
- sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/core.py +312 -0
- sqlspec/adapters/sqlite/data_dictionary.py +202 -0
- sqlspec/adapters/sqlite/driver.py +359 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.py +198 -0
- sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +747 -0
- sqlspec/builder/__init__.py +179 -0
- sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_base.py +1022 -0
- sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_ddl.py +1642 -0
- sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_dml.py +365 -0
- sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_factory.py +1697 -0
- sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_insert.py +328 -0
- sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_join.py +499 -0
- sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_merge.py +821 -0
- sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_parsing_utils.py +297 -0
- sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_select.py +1660 -0
- sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_temporal.py +139 -0
- sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_expressions.py +267 -0
- sqlspec/cli.py +911 -0
- sqlspec/config.py +1755 -0
- sqlspec/core/__init__.py +374 -0
- sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/cache.py +1069 -0
- sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/compiler.py +954 -0
- sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/filters.py +952 -0
- sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/hashing.py +262 -0
- sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +71 -0
- sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_alignment.py +270 -0
- sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_converter.py +543 -0
- sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_processor.py +505 -0
- sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_transformers.py +292 -0
- sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_types.py +499 -0
- sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_validator.py +180 -0
- sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/pipeline.py +319 -0
- sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/query_modifiers.py +437 -0
- sqlspec/core/result/__init__.py +23 -0
- sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_base.py +1121 -0
- sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/splitter.py +966 -0
- sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/statement.py +1503 -0
- sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/type_converter.py +339 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.py +123 -0
- sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +49 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
- sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +42 -0
- sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +34 -0
- sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +46 -0
- sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +42 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/driver/__init__.py +32 -0
- sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_async.py +1737 -0
- sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_common.py +1478 -0
- sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sql_helpers.py +148 -0
- sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_storage_helpers.py +144 -0
- sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sync.py +1710 -0
- sqlspec/exceptions.py +338 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +70 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +149 -0
- sqlspec/extensions/adk/memory/service.py +217 -0
- sqlspec/extensions/adk/memory/store.py +569 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +225 -0
- sqlspec/extensions/adk/store.py +567 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +461 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +19 -0
- sqlspec/extensions/fastapi/extension.py +351 -0
- sqlspec/extensions/fastapi/providers.py +607 -0
- sqlspec/extensions/flask/__init__.py +37 -0
- sqlspec/extensions/flask/_state.py +76 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +519 -0
- sqlspec/extensions/litestar/__init__.py +28 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +671 -0
- sqlspec/extensions/litestar/providers.py +526 -0
- sqlspec/extensions/litestar/store.py +296 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/starlette/__init__.py +19 -0
- sqlspec/extensions/starlette/_state.py +30 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +346 -0
- sqlspec/extensions/starlette/middleware.py +235 -0
- sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/loader.py +702 -0
- sqlspec/migrations/__init__.py +36 -0
- sqlspec/migrations/base.py +731 -0
- sqlspec/migrations/commands.py +1232 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.py +1172 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.py +611 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.py +207 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +55 -0
- sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_config.py +348 -0
- sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_dispatcher.py +152 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_observer.py +357 -0
- sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_runtime.py +420 -0
- sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +916 -0
- sqlspec/py.typed +0 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_utils.py +104 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.py +253 -0
- sqlspec/storage/backends/fsspec.py +529 -0
- sqlspec/storage/backends/local.py +441 -0
- sqlspec/storage/backends/obstore.py +916 -0
- sqlspec/storage/errors.py +104 -0
- sqlspec/storage/pipeline.py +582 -0
- sqlspec/storage/registry.py +301 -0
- sqlspec/typing.py +395 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +318 -0
- sqlspec/utils/config_tools.py +332 -0
- sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.py +190 -0
- sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/fixtures.py +258 -0
- sqlspec/utils/logging.py +222 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/portal.py +375 -0
- sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/schema.py +485 -0
- sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/serializers.py +408 -0
- sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/sync_tools.py +311 -0
- sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/text.py +108 -0
- sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_converters.py +128 -0
- sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_guards.py +1360 -0
- sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/uuids.py +225 -0
- sqlspec-0.36.0.dist-info/METADATA +205 -0
- sqlspec-0.36.0.dist-info/RECORD +531 -0
- sqlspec-0.36.0.dist-info/WHEEL +7 -0
- sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
- sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
"""DuckDB database configuration with connection pooling."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable, Sequence
|
|
4
|
+
from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast
|
|
5
|
+
|
|
6
|
+
from typing_extensions import NotRequired
|
|
7
|
+
|
|
8
|
+
from sqlspec.adapters.duckdb._typing import DuckDBConnection
|
|
9
|
+
from sqlspec.adapters.duckdb.core import (
|
|
10
|
+
apply_driver_features,
|
|
11
|
+
build_connection_config,
|
|
12
|
+
build_statement_config,
|
|
13
|
+
default_statement_config,
|
|
14
|
+
)
|
|
15
|
+
from sqlspec.adapters.duckdb.driver import DuckDBCursor, DuckDBDriver, DuckDBExceptionHandler, DuckDBSessionContext
|
|
16
|
+
from sqlspec.adapters.duckdb.pool import DuckDBConnectionPool
|
|
17
|
+
from sqlspec.config import ExtensionConfigs, SyncDatabaseConfig
|
|
18
|
+
from sqlspec.extensions.events import EventRuntimeHints
|
|
19
|
+
from sqlspec.observability import ObservabilityConfig
|
|
20
|
+
from sqlspec.utils.config_tools import normalize_connection_config
|
|
21
|
+
from sqlspec.utils.serializers import to_json
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from collections.abc import Callable
|
|
25
|
+
|
|
26
|
+
from sqlspec.core import StatementConfig
|
|
27
|
+
__all__ = (
|
|
28
|
+
"DuckDBConfig",
|
|
29
|
+
"DuckDBConnectionParams",
|
|
30
|
+
"DuckDBDriverFeatures",
|
|
31
|
+
"DuckDBExtensionConfig",
|
|
32
|
+
"DuckDBPoolParams",
|
|
33
|
+
"DuckDBSecretConfig",
|
|
34
|
+
)
|
|
35
|
+
EXTENSION_FLAG_KEYS: "tuple[str, ...]" = (
|
|
36
|
+
"allow_community_extensions",
|
|
37
|
+
"allow_unsigned_extensions",
|
|
38
|
+
"enable_external_access",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class DuckDBConnectionParams(TypedDict):
|
|
43
|
+
"""DuckDB connection parameters.
|
|
44
|
+
|
|
45
|
+
Mirrors the keyword arguments accepted by duckdb.connect so callers can drive every DuckDB
|
|
46
|
+
configuration switch directly through SQLSpec. All keys are optional and forwarded verbatim
|
|
47
|
+
to DuckDB, either as top-level parameters or via the nested ``config`` dictionary when DuckDB
|
|
48
|
+
expects them there.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
database: NotRequired[str]
|
|
52
|
+
read_only: NotRequired[bool]
|
|
53
|
+
config: NotRequired["dict[str, Any]"]
|
|
54
|
+
memory_limit: NotRequired[str]
|
|
55
|
+
threads: NotRequired[int]
|
|
56
|
+
temp_directory: NotRequired[str]
|
|
57
|
+
max_temp_directory_size: NotRequired[str]
|
|
58
|
+
autoload_known_extensions: NotRequired[bool]
|
|
59
|
+
autoinstall_known_extensions: NotRequired[bool]
|
|
60
|
+
allow_community_extensions: NotRequired[bool]
|
|
61
|
+
allow_unsigned_extensions: NotRequired[bool]
|
|
62
|
+
extension_directory: NotRequired[str]
|
|
63
|
+
custom_extension_repository: NotRequired[str]
|
|
64
|
+
autoinstall_extension_repository: NotRequired[str]
|
|
65
|
+
allow_persistent_secrets: NotRequired[bool]
|
|
66
|
+
enable_external_access: NotRequired[bool]
|
|
67
|
+
secret_directory: NotRequired[str]
|
|
68
|
+
enable_object_cache: NotRequired[bool]
|
|
69
|
+
parquet_metadata_cache: NotRequired[str]
|
|
70
|
+
enable_external_file_cache: NotRequired[bool]
|
|
71
|
+
checkpoint_threshold: NotRequired[str]
|
|
72
|
+
enable_progress_bar: NotRequired[bool]
|
|
73
|
+
progress_bar_time: NotRequired[float]
|
|
74
|
+
enable_logging: NotRequired[bool]
|
|
75
|
+
log_query_path: NotRequired[str]
|
|
76
|
+
logging_level: NotRequired[str]
|
|
77
|
+
preserve_insertion_order: NotRequired[bool]
|
|
78
|
+
default_null_order: NotRequired[str]
|
|
79
|
+
default_order: NotRequired[str]
|
|
80
|
+
ieee_floating_point_ops: NotRequired[bool]
|
|
81
|
+
binary_as_string: NotRequired[bool]
|
|
82
|
+
arrow_large_buffer_size: NotRequired[bool]
|
|
83
|
+
errors_as_json: NotRequired[bool]
|
|
84
|
+
extra: NotRequired["dict[str, Any]"]
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class DuckDBPoolParams(DuckDBConnectionParams):
|
|
88
|
+
"""Complete pool configuration for DuckDB adapter.
|
|
89
|
+
|
|
90
|
+
Extends DuckDBConnectionParams with pool sizing and lifecycle settings so SQLSpec can manage
|
|
91
|
+
per-thread DuckDB connections safely while honoring DuckDB's thread-safety constraints.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
pool_min_size: NotRequired[int]
|
|
95
|
+
pool_max_size: NotRequired[int]
|
|
96
|
+
pool_timeout: NotRequired[float]
|
|
97
|
+
pool_recycle_seconds: NotRequired[int]
|
|
98
|
+
health_check_interval: NotRequired[float]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class DuckDBExtensionConfig(TypedDict):
|
|
102
|
+
"""DuckDB extension configuration for auto-management."""
|
|
103
|
+
|
|
104
|
+
name: str
|
|
105
|
+
"""Name of the extension to install/load."""
|
|
106
|
+
|
|
107
|
+
version: NotRequired[str]
|
|
108
|
+
"""Specific version of the extension."""
|
|
109
|
+
|
|
110
|
+
repository: NotRequired[str]
|
|
111
|
+
"""Repository for the extension (core, community, or custom URL)."""
|
|
112
|
+
|
|
113
|
+
force_install: NotRequired[bool]
|
|
114
|
+
"""Force reinstallation of the extension."""
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class DuckDBSecretConfig(TypedDict):
|
|
118
|
+
"""DuckDB secret configuration for AI/API integrations."""
|
|
119
|
+
|
|
120
|
+
secret_type: str
|
|
121
|
+
"""Type of secret (e.g., 'openai', 'aws', 'azure', 'gcp')."""
|
|
122
|
+
|
|
123
|
+
name: str
|
|
124
|
+
"""Name of the secret."""
|
|
125
|
+
|
|
126
|
+
value: "dict[str, Any]"
|
|
127
|
+
"""Secret configuration values."""
|
|
128
|
+
|
|
129
|
+
scope: NotRequired[str]
|
|
130
|
+
"""Scope of the secret (LOCAL or PERSISTENT)."""
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class DuckDBDriverFeatures(TypedDict):
|
|
134
|
+
"""TypedDict for DuckDB driver features configuration.
|
|
135
|
+
|
|
136
|
+
Attributes:
|
|
137
|
+
extensions: List of extensions to install/load on connection creation.
|
|
138
|
+
secrets: List of secrets to create for AI/API integrations.
|
|
139
|
+
on_connection_create: Callback executed when connection is created.
|
|
140
|
+
json_serializer: Custom JSON serializer for dict/list parameter conversion.
|
|
141
|
+
Defaults to sqlspec.utils.serializers.to_json if not provided.
|
|
142
|
+
enable_uuid_conversion: Enable automatic UUID string conversion.
|
|
143
|
+
When True (default), UUID strings are automatically converted to UUID objects.
|
|
144
|
+
When False, UUID strings are treated as regular strings.
|
|
145
|
+
extension_flags: Connection-level flags (e.g., allow_community_extensions) applied
|
|
146
|
+
via SET statements immediately after connection creation.
|
|
147
|
+
enable_events: Enable database event channel support.
|
|
148
|
+
Defaults to True when extension_config["events"] is configured.
|
|
149
|
+
Provides pub/sub capabilities via table-backed queue (DuckDB has no native pub/sub).
|
|
150
|
+
Requires extension_config["events"] for migration setup.
|
|
151
|
+
events_backend: Event channel backend selection.
|
|
152
|
+
Only option: "table_queue" (durable table-backed queue with retries and exactly-once delivery).
|
|
153
|
+
DuckDB does not have native pub/sub, so table_queue is the only backend.
|
|
154
|
+
Defaults to "table_queue".
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
extensions: NotRequired[Sequence[DuckDBExtensionConfig]]
|
|
158
|
+
secrets: NotRequired[Sequence[DuckDBSecretConfig]]
|
|
159
|
+
on_connection_create: NotRequired["Callable[[DuckDBConnection], DuckDBConnection | None]"]
|
|
160
|
+
json_serializer: NotRequired["Callable[[Any], str]"]
|
|
161
|
+
enable_uuid_conversion: NotRequired[bool]
|
|
162
|
+
extension_flags: NotRequired["dict[str, Any]"]
|
|
163
|
+
enable_events: NotRequired[bool]
|
|
164
|
+
events_backend: NotRequired[str]
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class DuckDBConnectionContext:
|
|
168
|
+
"""Context manager for DuckDB connections."""
|
|
169
|
+
|
|
170
|
+
__slots__ = ("_config", "_ctx")
|
|
171
|
+
|
|
172
|
+
def __init__(self, config: "DuckDBConfig") -> None:
|
|
173
|
+
self._config = config
|
|
174
|
+
self._ctx: Any = None
|
|
175
|
+
|
|
176
|
+
def __enter__(self) -> DuckDBConnection:
|
|
177
|
+
pool = self._config.provide_pool()
|
|
178
|
+
self._ctx = pool.get_connection()
|
|
179
|
+
return cast("DuckDBConnection", self._ctx.__enter__())
|
|
180
|
+
|
|
181
|
+
def __exit__(
|
|
182
|
+
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
|
|
183
|
+
) -> bool | None:
|
|
184
|
+
if self._ctx:
|
|
185
|
+
return cast("bool | None", self._ctx.__exit__(exc_type, exc_val, exc_tb))
|
|
186
|
+
return None
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class _DuckDBConnectionHook:
|
|
190
|
+
__slots__ = ("_hook",)
|
|
191
|
+
|
|
192
|
+
def __init__(self, hook: "Callable[[Any], None]") -> None:
|
|
193
|
+
self._hook = hook
|
|
194
|
+
|
|
195
|
+
def __call__(self, context: "dict[str, Any]") -> None:
|
|
196
|
+
connection = context.get("connection")
|
|
197
|
+
if connection is None:
|
|
198
|
+
return
|
|
199
|
+
self._hook(connection)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class _DuckDBSessionConnectionHandler:
|
|
203
|
+
__slots__ = ("_config", "_ctx")
|
|
204
|
+
|
|
205
|
+
def __init__(self, config: "DuckDBConfig") -> None:
|
|
206
|
+
self._config = config
|
|
207
|
+
self._ctx: Any = None
|
|
208
|
+
|
|
209
|
+
def acquire_connection(self) -> "DuckDBConnection":
|
|
210
|
+
pool = self._config.provide_pool()
|
|
211
|
+
self._ctx = pool.get_connection()
|
|
212
|
+
return cast("DuckDBConnection", self._ctx.__enter__())
|
|
213
|
+
|
|
214
|
+
def release_connection(self, _conn: "DuckDBConnection") -> None:
|
|
215
|
+
if self._ctx is None:
|
|
216
|
+
return
|
|
217
|
+
self._ctx.__exit__(None, None, None)
|
|
218
|
+
self._ctx = None
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class DuckDBConfig(SyncDatabaseConfig[DuckDBConnection, DuckDBConnectionPool, DuckDBDriver]):
|
|
222
|
+
"""DuckDB configuration with connection pooling.
|
|
223
|
+
|
|
224
|
+
This configuration supports DuckDB's features including:
|
|
225
|
+
|
|
226
|
+
- Connection pooling
|
|
227
|
+
- Extension management and installation
|
|
228
|
+
- Secret management for API integrations
|
|
229
|
+
- Auto configuration settings
|
|
230
|
+
- Arrow integration
|
|
231
|
+
- Direct file querying capabilities
|
|
232
|
+
- Configurable type handlers for JSON serialization and UUID conversion
|
|
233
|
+
|
|
234
|
+
DuckDB Connection Pool Configuration:
|
|
235
|
+
- Default pool size is 1-4 connections (DuckDB uses single connection by default)
|
|
236
|
+
- Connection recycling is set to 24 hours by default (set to 0 to disable)
|
|
237
|
+
- Shared memory databases use `:memory:shared_db` for proper concurrency
|
|
238
|
+
|
|
239
|
+
Type Handler Configuration via driver_features:
|
|
240
|
+
- `json_serializer`: Custom JSON serializer for dict/list parameters.
|
|
241
|
+
Defaults to `sqlspec.utils.serializers.to_json` if not provided.
|
|
242
|
+
Example: `json_serializer=msgspec.json.encode(...).decode('utf-8')`
|
|
243
|
+
|
|
244
|
+
- `enable_uuid_conversion`: Enable automatic UUID string conversion (default: True).
|
|
245
|
+
When True, UUID strings in query results are automatically converted to UUID objects.
|
|
246
|
+
When False, UUID strings are treated as regular strings.
|
|
247
|
+
|
|
248
|
+
Example:
|
|
249
|
+
>>> import msgspec
|
|
250
|
+
>>> from sqlspec.adapters.duckdb import DuckDBConfig
|
|
251
|
+
>>>
|
|
252
|
+
>>> # Custom JSON serializer
|
|
253
|
+
>>> def custom_json(obj):
|
|
254
|
+
... return msgspec.json.encode(obj).decode("utf-8")
|
|
255
|
+
>>>
|
|
256
|
+
>>> config = DuckDBConfig(
|
|
257
|
+
... connection_config={"database": ":memory:"},
|
|
258
|
+
... driver_features={
|
|
259
|
+
... "json_serializer": custom_json,
|
|
260
|
+
... "enable_uuid_conversion": False,
|
|
261
|
+
... },
|
|
262
|
+
... )
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
driver_type: "ClassVar[type[DuckDBDriver]]" = DuckDBDriver
|
|
266
|
+
connection_type: "ClassVar[type[DuckDBConnection]]" = DuckDBConnection
|
|
267
|
+
supports_transactional_ddl: "ClassVar[bool]" = True
|
|
268
|
+
supports_native_arrow_export: "ClassVar[bool]" = True
|
|
269
|
+
supports_native_arrow_import: "ClassVar[bool]" = True
|
|
270
|
+
supports_native_parquet_export: "ClassVar[bool]" = True
|
|
271
|
+
supports_native_parquet_import: "ClassVar[bool]" = True
|
|
272
|
+
storage_partition_strategies: "ClassVar[tuple[str, ...]]" = ("fixed", "rows_per_chunk", "manifest")
|
|
273
|
+
|
|
274
|
+
def __init__(
|
|
275
|
+
self,
|
|
276
|
+
*,
|
|
277
|
+
connection_config: "DuckDBPoolParams | dict[str, Any] | None" = None,
|
|
278
|
+
connection_instance: "DuckDBConnectionPool | None" = None,
|
|
279
|
+
migration_config: "dict[str, Any] | None" = None,
|
|
280
|
+
statement_config: "StatementConfig | None" = None,
|
|
281
|
+
driver_features: "DuckDBDriverFeatures | dict[str, Any] | None" = None,
|
|
282
|
+
bind_key: "str | None" = None,
|
|
283
|
+
extension_config: "ExtensionConfigs | None" = None,
|
|
284
|
+
observability_config: "ObservabilityConfig | None" = None,
|
|
285
|
+
**kwargs: Any,
|
|
286
|
+
) -> None:
|
|
287
|
+
"""Initialize DuckDB configuration.
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
connection_config: Connection and pool configuration parameters
|
|
291
|
+
connection_instance: Pre-created pool instance
|
|
292
|
+
migration_config: Migration configuration
|
|
293
|
+
statement_config: Statement configuration override
|
|
294
|
+
driver_features: DuckDB-specific driver features including json_serializer
|
|
295
|
+
and enable_uuid_conversion options
|
|
296
|
+
bind_key: Optional unique identifier for this configuration
|
|
297
|
+
extension_config: Extension-specific configuration (e.g., Litestar plugin settings)
|
|
298
|
+
observability_config: Adapter-level observability overrides for lifecycle hooks and observers
|
|
299
|
+
**kwargs: Additional keyword arguments passed to the base configuration.
|
|
300
|
+
"""
|
|
301
|
+
connection_config = normalize_connection_config(connection_config)
|
|
302
|
+
connection_config.setdefault("database", ":memory:shared_db")
|
|
303
|
+
|
|
304
|
+
if connection_config.get("database") in {":memory:", ""}:
|
|
305
|
+
connection_config["database"] = ":memory:shared_db"
|
|
306
|
+
|
|
307
|
+
extension_flags: dict[str, Any] = {}
|
|
308
|
+
for key in tuple(connection_config.keys()):
|
|
309
|
+
if key in EXTENSION_FLAG_KEYS:
|
|
310
|
+
extension_flags[key] = connection_config.pop(key)
|
|
311
|
+
|
|
312
|
+
features: dict[str, Any] = dict(driver_features) if driver_features else {}
|
|
313
|
+
user_connection_hook = cast("Callable[[Any], None] | None", features.pop("on_connection_create", None))
|
|
314
|
+
features.setdefault("enable_uuid_conversion", True)
|
|
315
|
+
serializer = features.setdefault("json_serializer", to_json)
|
|
316
|
+
|
|
317
|
+
if extension_flags:
|
|
318
|
+
existing_flags = cast("dict[str, Any]", features.get("extension_flags", {}))
|
|
319
|
+
merged_flags = {**existing_flags, **extension_flags}
|
|
320
|
+
features["extension_flags"] = merged_flags
|
|
321
|
+
|
|
322
|
+
local_observability = observability_config
|
|
323
|
+
if user_connection_hook is not None:
|
|
324
|
+
lifecycle_override = ObservabilityConfig(
|
|
325
|
+
lifecycle={"on_connection_create": [_DuckDBConnectionHook(user_connection_hook)]}
|
|
326
|
+
)
|
|
327
|
+
local_observability = ObservabilityConfig.merge(local_observability, lifecycle_override)
|
|
328
|
+
|
|
329
|
+
statement_config = statement_config or build_statement_config(
|
|
330
|
+
json_serializer=cast("Callable[[Any], str]", serializer)
|
|
331
|
+
)
|
|
332
|
+
statement_config = apply_driver_features(statement_config, features)
|
|
333
|
+
|
|
334
|
+
super().__init__(
|
|
335
|
+
bind_key=bind_key,
|
|
336
|
+
connection_config=connection_config,
|
|
337
|
+
connection_instance=connection_instance,
|
|
338
|
+
migration_config=migration_config,
|
|
339
|
+
statement_config=statement_config,
|
|
340
|
+
driver_features=features,
|
|
341
|
+
extension_config=extension_config,
|
|
342
|
+
observability_config=local_observability,
|
|
343
|
+
**kwargs,
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
def _create_pool(self) -> DuckDBConnectionPool:
|
|
347
|
+
"""Create connection pool from configuration."""
|
|
348
|
+
connection_config = build_connection_config(self.connection_config)
|
|
349
|
+
|
|
350
|
+
extensions = self.driver_features.get("extensions", None)
|
|
351
|
+
secrets = self.driver_features.get("secrets", None)
|
|
352
|
+
extension_flags = self.driver_features.get("extension_flags", None)
|
|
353
|
+
extensions_dicts = [dict(ext) for ext in extensions] if extensions else None
|
|
354
|
+
secrets_dicts = [dict(secret) for secret in secrets] if secrets else None
|
|
355
|
+
extension_flags_dict = dict(extension_flags) if extension_flags else None
|
|
356
|
+
|
|
357
|
+
pool_recycle_seconds = self.connection_config.get("pool_recycle_seconds")
|
|
358
|
+
health_check_interval = self.connection_config.get("health_check_interval")
|
|
359
|
+
pool_kwargs: dict[str, Any] = {}
|
|
360
|
+
if pool_recycle_seconds is not None:
|
|
361
|
+
pool_kwargs["pool_recycle_seconds"] = pool_recycle_seconds
|
|
362
|
+
if health_check_interval is not None:
|
|
363
|
+
pool_kwargs["health_check_interval"] = health_check_interval
|
|
364
|
+
|
|
365
|
+
return DuckDBConnectionPool(
|
|
366
|
+
connection_config=connection_config,
|
|
367
|
+
extensions=extensions_dicts,
|
|
368
|
+
extension_flags=extension_flags_dict,
|
|
369
|
+
secrets=secrets_dicts,
|
|
370
|
+
**pool_kwargs,
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
def _close_pool(self) -> None:
|
|
374
|
+
"""Close the connection pool."""
|
|
375
|
+
if self.connection_instance:
|
|
376
|
+
self.connection_instance.close()
|
|
377
|
+
|
|
378
|
+
def create_connection(self) -> DuckDBConnection:
|
|
379
|
+
"""Get a DuckDB connection from the pool.
|
|
380
|
+
|
|
381
|
+
This method ensures the pool is created and returns a connection
|
|
382
|
+
from the pool. The connection is checked out from the pool and must
|
|
383
|
+
be properly managed by the caller.
|
|
384
|
+
|
|
385
|
+
Returns:
|
|
386
|
+
DuckDBConnection: A connection from the pool
|
|
387
|
+
|
|
388
|
+
Note:
|
|
389
|
+
For automatic connection management, prefer using provide_connection()
|
|
390
|
+
or provide_session() which handle returning connections to the pool.
|
|
391
|
+
The caller is responsible for returning the connection to the pool
|
|
392
|
+
using pool.release(connection) when done.
|
|
393
|
+
"""
|
|
394
|
+
pool = self.provide_pool()
|
|
395
|
+
|
|
396
|
+
return pool.acquire()
|
|
397
|
+
|
|
398
|
+
def provide_connection(self, *args: Any, **kwargs: Any) -> "DuckDBConnectionContext":
|
|
399
|
+
"""Provide a pooled DuckDB connection context manager.
|
|
400
|
+
|
|
401
|
+
Args:
|
|
402
|
+
*args: Additional arguments.
|
|
403
|
+
**kwargs: Additional keyword arguments.
|
|
404
|
+
|
|
405
|
+
Returns:
|
|
406
|
+
A DuckDB connection context manager.
|
|
407
|
+
"""
|
|
408
|
+
return DuckDBConnectionContext(self)
|
|
409
|
+
|
|
410
|
+
def provide_session(
|
|
411
|
+
self, *_args: Any, statement_config: "StatementConfig | None" = None, **_kwargs: Any
|
|
412
|
+
) -> "DuckDBSessionContext":
|
|
413
|
+
"""Provide a DuckDB driver session context manager.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
*_args: Additional arguments.
|
|
417
|
+
statement_config: Optional statement configuration override.
|
|
418
|
+
**_kwargs: Additional keyword arguments.
|
|
419
|
+
|
|
420
|
+
Returns:
|
|
421
|
+
A DuckDB driver session context manager.
|
|
422
|
+
"""
|
|
423
|
+
handler = _DuckDBSessionConnectionHandler(self)
|
|
424
|
+
|
|
425
|
+
return DuckDBSessionContext(
|
|
426
|
+
acquire_connection=handler.acquire_connection,
|
|
427
|
+
release_connection=handler.release_connection,
|
|
428
|
+
statement_config=statement_config or self.statement_config or default_statement_config,
|
|
429
|
+
driver_features=self.driver_features,
|
|
430
|
+
prepare_driver=self._prepare_driver,
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
def get_signature_namespace(self) -> "dict[str, Any]":
|
|
434
|
+
"""Get the signature namespace for DuckDB types.
|
|
435
|
+
|
|
436
|
+
This provides all DuckDB-specific types that Litestar needs to recognize
|
|
437
|
+
to avoid serialization attempts.
|
|
438
|
+
|
|
439
|
+
Returns:
|
|
440
|
+
Dictionary mapping type names to types.
|
|
441
|
+
"""
|
|
442
|
+
|
|
443
|
+
namespace = super().get_signature_namespace()
|
|
444
|
+
namespace.update({
|
|
445
|
+
"DuckDBConnectionContext": DuckDBConnectionContext,
|
|
446
|
+
"DuckDBConnection": DuckDBConnection,
|
|
447
|
+
"DuckDBConnectionParams": DuckDBConnectionParams,
|
|
448
|
+
"DuckDBConnectionPool": DuckDBConnectionPool,
|
|
449
|
+
"DuckDBCursor": DuckDBCursor,
|
|
450
|
+
"DuckDBDriver": DuckDBDriver,
|
|
451
|
+
"DuckDBDriverFeatures": DuckDBDriverFeatures,
|
|
452
|
+
"DuckDBExceptionHandler": DuckDBExceptionHandler,
|
|
453
|
+
"DuckDBExtensionConfig": DuckDBExtensionConfig,
|
|
454
|
+
"DuckDBPoolParams": DuckDBPoolParams,
|
|
455
|
+
"DuckDBSecretConfig": DuckDBSecretConfig,
|
|
456
|
+
"DuckDBSessionContext": DuckDBSessionContext,
|
|
457
|
+
})
|
|
458
|
+
return namespace
|
|
459
|
+
|
|
460
|
+
def get_event_runtime_hints(self) -> "EventRuntimeHints":
|
|
461
|
+
"""Return polling defaults optimized for DuckDB."""
|
|
462
|
+
|
|
463
|
+
return EventRuntimeHints(poll_interval=0.15, lease_seconds=15)
|
|
Binary file
|