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,202 @@
|
|
|
1
|
+
"""SQLite-specific data dictionary for metadata queries."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from mypy_extensions import mypyc_attr
|
|
6
|
+
|
|
7
|
+
from sqlspec.adapters.sqlite.core import format_identifier
|
|
8
|
+
from sqlspec.data_dictionary import get_dialect_config
|
|
9
|
+
from sqlspec.driver import SyncDataDictionaryBase
|
|
10
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
11
|
+
|
|
12
|
+
__all__ = ("SqliteDataDictionary",)
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from sqlspec.adapters.sqlite.driver import SqliteDriver
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
19
|
+
class SqliteDataDictionary(SyncDataDictionaryBase):
|
|
20
|
+
"""SQLite-specific sync data dictionary."""
|
|
21
|
+
|
|
22
|
+
dialect: ClassVar[str] = "sqlite"
|
|
23
|
+
|
|
24
|
+
def __init__(self) -> None:
|
|
25
|
+
super().__init__()
|
|
26
|
+
|
|
27
|
+
def resolve_schema(self, schema: "str | None") -> "str | None":
|
|
28
|
+
"""Return a schema name using dialect defaults when missing."""
|
|
29
|
+
if schema is not None:
|
|
30
|
+
return schema
|
|
31
|
+
return get_dialect_config(type(self).dialect).default_schema
|
|
32
|
+
|
|
33
|
+
def get_version(self, driver: "SqliteDriver") -> "VersionInfo | None":
|
|
34
|
+
"""Get SQLite database version information.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
driver: Sync database driver instance.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
SQLite version information or None if detection fails.
|
|
41
|
+
|
|
42
|
+
"""
|
|
43
|
+
driver_id = id(driver)
|
|
44
|
+
# Inline cache check to avoid cross-module method call that causes mypyc segfault
|
|
45
|
+
if driver_id in self._version_fetch_attempted:
|
|
46
|
+
return self._version_cache.get(driver_id)
|
|
47
|
+
# Not cached, fetch from database
|
|
48
|
+
|
|
49
|
+
version_value = driver.select_value_or_none(self.get_query("version"))
|
|
50
|
+
if not version_value:
|
|
51
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
52
|
+
self.cache_version(driver_id, None)
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
config = get_dialect_config(type(self).dialect)
|
|
56
|
+
version_info = self.parse_version_with_pattern(config.version_pattern, str(version_value))
|
|
57
|
+
if version_info is None:
|
|
58
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
59
|
+
self.cache_version(driver_id, None)
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
63
|
+
self.cache_version(driver_id, version_info)
|
|
64
|
+
return version_info
|
|
65
|
+
|
|
66
|
+
def get_feature_flag(self, driver: "SqliteDriver", feature: str) -> bool:
|
|
67
|
+
"""Check if SQLite database supports a specific feature.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
driver: Sync database driver instance.
|
|
71
|
+
feature: Feature name to check.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
True if feature is supported, False otherwise.
|
|
75
|
+
|
|
76
|
+
"""
|
|
77
|
+
version_info = self.get_version(driver)
|
|
78
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
79
|
+
|
|
80
|
+
def get_optimal_type(self, driver: "SqliteDriver", type_category: str) -> str:
|
|
81
|
+
"""Get optimal SQLite type for a category.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
driver: Sync database driver instance.
|
|
85
|
+
type_category: Type category.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
SQLite-specific type name.
|
|
89
|
+
|
|
90
|
+
"""
|
|
91
|
+
config = get_dialect_config(type(self).dialect)
|
|
92
|
+
version_info = self.get_version(driver)
|
|
93
|
+
|
|
94
|
+
if type_category == "json":
|
|
95
|
+
json_version = config.get_feature_version("supports_json")
|
|
96
|
+
if version_info and json_version and version_info >= json_version:
|
|
97
|
+
return "JSON"
|
|
98
|
+
return "TEXT"
|
|
99
|
+
|
|
100
|
+
return config.get_optimal_type(type_category)
|
|
101
|
+
|
|
102
|
+
def list_available_features(self) -> "list[str]":
|
|
103
|
+
"""List available feature flags for this dialect."""
|
|
104
|
+
config = get_dialect_config(type(self).dialect)
|
|
105
|
+
features = set(config.feature_flags.keys()) | set(config.feature_versions.keys())
|
|
106
|
+
return sorted(features)
|
|
107
|
+
|
|
108
|
+
def get_tables(self, driver: "SqliteDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
109
|
+
"""Get tables sorted by topological dependency order using SQLite catalog."""
|
|
110
|
+
schema_name = self.resolve_schema(schema)
|
|
111
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
112
|
+
schema_prefix = f"{format_identifier(schema_name)}." if schema_name else ""
|
|
113
|
+
query_text = self.get_query_text("tables_by_schema").format(schema_prefix=schema_prefix)
|
|
114
|
+
return driver.select(query_text, schema_type=TableMetadata)
|
|
115
|
+
|
|
116
|
+
def get_columns(
|
|
117
|
+
self, driver: "SqliteDriver", table: "str | None" = None, schema: "str | None" = None
|
|
118
|
+
) -> "list[ColumnMetadata]":
|
|
119
|
+
"""Get column information for a table or schema."""
|
|
120
|
+
schema_name = self.resolve_schema(schema)
|
|
121
|
+
schema_prefix = f"{format_identifier(schema_name)}." if schema_name else ""
|
|
122
|
+
if table is None:
|
|
123
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
124
|
+
query_text = self.get_query_text("columns_by_schema").format(schema_prefix=schema_prefix)
|
|
125
|
+
return driver.select(query_text, schema_type=ColumnMetadata)
|
|
126
|
+
|
|
127
|
+
assert table is not None
|
|
128
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
129
|
+
table_name = table
|
|
130
|
+
table_identifier = f"{schema_name}.{table_name}" if schema_name else table_name
|
|
131
|
+
query_text = self.get_query_text("columns_by_table").format(table_name=format_identifier(table_identifier))
|
|
132
|
+
return driver.select(query_text, schema_type=ColumnMetadata)
|
|
133
|
+
|
|
134
|
+
def get_indexes(
|
|
135
|
+
self, driver: "SqliteDriver", table: "str | None" = None, schema: "str | None" = None
|
|
136
|
+
) -> "list[IndexMetadata]":
|
|
137
|
+
"""Get index metadata for a table or schema."""
|
|
138
|
+
schema_name = self.resolve_schema(schema)
|
|
139
|
+
indexes: list[IndexMetadata] = []
|
|
140
|
+
if table is None:
|
|
141
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
142
|
+
for table_info in self.get_tables(driver, schema=schema_name):
|
|
143
|
+
table_name = table_info.get("table_name")
|
|
144
|
+
if not table_name:
|
|
145
|
+
continue
|
|
146
|
+
indexes.extend(self.get_indexes(driver, table=table_name, schema=schema_name))
|
|
147
|
+
return indexes
|
|
148
|
+
|
|
149
|
+
assert table is not None
|
|
150
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
151
|
+
table_name = table
|
|
152
|
+
table_identifier = f"{schema_name}.{table_name}" if schema_name else table_name
|
|
153
|
+
index_list_sql = self.get_query_text("indexes_by_table").format(table_name=format_identifier(table_identifier))
|
|
154
|
+
index_rows = driver.select(index_list_sql)
|
|
155
|
+
for row in index_rows:
|
|
156
|
+
index_name = row.get("name")
|
|
157
|
+
if not index_name:
|
|
158
|
+
continue
|
|
159
|
+
index_identifier = f"{schema_name}.{index_name}" if schema_name else index_name
|
|
160
|
+
columns_sql = self.get_query_text("index_columns_by_index").format(
|
|
161
|
+
index_name=format_identifier(index_identifier)
|
|
162
|
+
)
|
|
163
|
+
columns_rows = driver.select(columns_sql)
|
|
164
|
+
columns: list[str] = []
|
|
165
|
+
for col in columns_rows:
|
|
166
|
+
column_name = col.get("name")
|
|
167
|
+
if column_name is None:
|
|
168
|
+
continue
|
|
169
|
+
columns.append(str(column_name))
|
|
170
|
+
is_primary = row.get("origin") == "pk"
|
|
171
|
+
index_metadata: IndexMetadata = {
|
|
172
|
+
"index_name": index_name,
|
|
173
|
+
"table_name": table_name,
|
|
174
|
+
"columns": columns,
|
|
175
|
+
"is_primary": is_primary,
|
|
176
|
+
}
|
|
177
|
+
if schema_name is not None:
|
|
178
|
+
index_metadata["schema_name"] = schema_name
|
|
179
|
+
unique_value = row.get("unique")
|
|
180
|
+
if unique_value is not None:
|
|
181
|
+
index_metadata["is_unique"] = unique_value
|
|
182
|
+
indexes.append(index_metadata)
|
|
183
|
+
return indexes
|
|
184
|
+
|
|
185
|
+
def get_foreign_keys(
|
|
186
|
+
self, driver: "SqliteDriver", table: "str | None" = None, schema: "str | None" = None
|
|
187
|
+
) -> "list[ForeignKeyMetadata]":
|
|
188
|
+
"""Get foreign key metadata."""
|
|
189
|
+
schema_name = self.resolve_schema(schema)
|
|
190
|
+
schema_prefix = f"{format_identifier(schema_name)}." if schema_name else ""
|
|
191
|
+
if table is None:
|
|
192
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
193
|
+
query_text = self.get_query_text("foreign_keys_by_schema").format(schema_prefix=schema_prefix)
|
|
194
|
+
return driver.select(query_text, schema_type=ForeignKeyMetadata)
|
|
195
|
+
|
|
196
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
197
|
+
table_label = table.replace("'", "''")
|
|
198
|
+
table_identifier = f"{schema_name}.{table}" if schema_name else table
|
|
199
|
+
query_text = self.get_query_text("foreign_keys_by_table").format(
|
|
200
|
+
table_name=format_identifier(table_identifier), table_label=table_label
|
|
201
|
+
)
|
|
202
|
+
return driver.select(query_text, schema_type=ForeignKeyMetadata)
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
"""SQLite driver implementation."""
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
import sqlite3
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from sqlspec.adapters.sqlite._typing import SqliteSessionContext
|
|
8
|
+
from sqlspec.adapters.sqlite.core import (
|
|
9
|
+
build_insert_statement,
|
|
10
|
+
collect_rows,
|
|
11
|
+
create_mapped_exception,
|
|
12
|
+
default_statement_config,
|
|
13
|
+
driver_profile,
|
|
14
|
+
format_identifier,
|
|
15
|
+
normalize_execute_many_parameters,
|
|
16
|
+
normalize_execute_parameters,
|
|
17
|
+
resolve_rowcount,
|
|
18
|
+
)
|
|
19
|
+
from sqlspec.adapters.sqlite.data_dictionary import SqliteDataDictionary
|
|
20
|
+
from sqlspec.core import ArrowResult, get_cache_config, register_driver_profile
|
|
21
|
+
from sqlspec.driver import SyncDriverAdapterBase
|
|
22
|
+
from sqlspec.exceptions import SQLSpecError
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from sqlspec.adapters.sqlite._typing import SqliteConnection
|
|
26
|
+
from sqlspec.core import SQL, StatementConfig
|
|
27
|
+
from sqlspec.driver import ExecutionResult
|
|
28
|
+
from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
|
|
29
|
+
|
|
30
|
+
__all__ = ("SqliteCursor", "SqliteDriver", "SqliteExceptionHandler", "SqliteSessionContext")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SqliteCursor:
|
|
34
|
+
"""Context manager for SQLite cursor management.
|
|
35
|
+
|
|
36
|
+
Provides automatic cursor creation and cleanup for SQLite database operations.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
__slots__ = ("connection", "cursor")
|
|
40
|
+
|
|
41
|
+
def __init__(self, connection: "SqliteConnection") -> None:
|
|
42
|
+
"""Initialize cursor manager.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
connection: SQLite database connection
|
|
46
|
+
"""
|
|
47
|
+
self.connection = connection
|
|
48
|
+
self.cursor: sqlite3.Cursor | None = None
|
|
49
|
+
|
|
50
|
+
def __enter__(self) -> "sqlite3.Cursor":
|
|
51
|
+
"""Create and return a new cursor.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Active SQLite cursor object
|
|
55
|
+
"""
|
|
56
|
+
self.cursor = self.connection.cursor()
|
|
57
|
+
return self.cursor
|
|
58
|
+
|
|
59
|
+
def __exit__(self, *_: Any) -> None:
|
|
60
|
+
"""Clean up cursor resources.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
exc_type: Exception type if an exception occurred
|
|
64
|
+
exc_val: Exception value if an exception occurred
|
|
65
|
+
exc_tb: Exception traceback if an exception occurred
|
|
66
|
+
"""
|
|
67
|
+
if self.cursor is not None:
|
|
68
|
+
with contextlib.suppress(Exception):
|
|
69
|
+
self.cursor.close()
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class SqliteExceptionHandler:
|
|
73
|
+
"""Context manager for handling SQLite database exceptions.
|
|
74
|
+
|
|
75
|
+
Maps SQLite extended result codes to specific SQLSpec exceptions
|
|
76
|
+
for better error handling in application code.
|
|
77
|
+
|
|
78
|
+
Uses deferred exception pattern for mypyc compatibility: exceptions
|
|
79
|
+
are stored in pending_exception rather than raised from __exit__
|
|
80
|
+
to avoid ABI boundary violations with compiled code.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
__slots__ = ("pending_exception",)
|
|
84
|
+
|
|
85
|
+
def __init__(self) -> None:
|
|
86
|
+
self.pending_exception: Exception | None = None
|
|
87
|
+
|
|
88
|
+
def __enter__(self) -> "SqliteExceptionHandler":
|
|
89
|
+
return self
|
|
90
|
+
|
|
91
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
92
|
+
if exc_type is None:
|
|
93
|
+
return False
|
|
94
|
+
if issubclass(exc_type, sqlite3.Error):
|
|
95
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
96
|
+
return True
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class SqliteDriver(SyncDriverAdapterBase):
|
|
101
|
+
"""SQLite driver implementation.
|
|
102
|
+
|
|
103
|
+
Provides SQL statement execution, transaction management, and result handling
|
|
104
|
+
for SQLite databases using the standard sqlite3 module.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
__slots__ = ("_data_dictionary",)
|
|
108
|
+
dialect = "sqlite"
|
|
109
|
+
|
|
110
|
+
def __init__(
|
|
111
|
+
self,
|
|
112
|
+
connection: "SqliteConnection",
|
|
113
|
+
statement_config: "StatementConfig | None" = None,
|
|
114
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
115
|
+
) -> None:
|
|
116
|
+
"""Initialize SQLite driver.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
connection: SQLite database connection
|
|
120
|
+
statement_config: Statement configuration settings
|
|
121
|
+
driver_features: Driver-specific feature flags
|
|
122
|
+
"""
|
|
123
|
+
if statement_config is None:
|
|
124
|
+
statement_config = default_statement_config.replace(
|
|
125
|
+
enable_caching=get_cache_config().compiled_cache_enabled
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
129
|
+
self._data_dictionary: SqliteDataDictionary | None = None
|
|
130
|
+
|
|
131
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
132
|
+
# CORE DISPATCH METHODS
|
|
133
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
134
|
+
|
|
135
|
+
def dispatch_execute(self, cursor: "sqlite3.Cursor", statement: "SQL") -> "ExecutionResult":
|
|
136
|
+
"""Execute single SQL statement.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
cursor: SQLite cursor object
|
|
140
|
+
statement: SQL statement to execute
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
ExecutionResult with statement execution details
|
|
144
|
+
"""
|
|
145
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
146
|
+
cursor.execute(sql, normalize_execute_parameters(prepared_parameters))
|
|
147
|
+
|
|
148
|
+
if statement.returns_rows():
|
|
149
|
+
fetched_data = cursor.fetchall()
|
|
150
|
+
data, column_names, row_count = collect_rows(fetched_data, cursor.description)
|
|
151
|
+
|
|
152
|
+
return self.create_execution_result(
|
|
153
|
+
cursor, selected_data=data, column_names=column_names, data_row_count=row_count, is_select_result=True
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
affected_rows = resolve_rowcount(cursor)
|
|
157
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows)
|
|
158
|
+
|
|
159
|
+
def dispatch_execute_many(self, cursor: "sqlite3.Cursor", statement: "SQL") -> "ExecutionResult":
|
|
160
|
+
"""Execute SQL with multiple parameter sets.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
cursor: SQLite cursor object
|
|
164
|
+
statement: SQL statement with multiple parameter sets
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
ExecutionResult with batch execution details
|
|
168
|
+
"""
|
|
169
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
170
|
+
|
|
171
|
+
cursor.executemany(sql, normalize_execute_many_parameters(prepared_parameters))
|
|
172
|
+
|
|
173
|
+
affected_rows = resolve_rowcount(cursor)
|
|
174
|
+
|
|
175
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows, is_many_result=True)
|
|
176
|
+
|
|
177
|
+
def dispatch_execute_script(self, cursor: "sqlite3.Cursor", statement: "SQL") -> "ExecutionResult":
|
|
178
|
+
"""Execute SQL script with statement splitting and parameter handling.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
cursor: SQLite cursor object
|
|
182
|
+
statement: SQL statement containing multiple statements
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
ExecutionResult with script execution details
|
|
186
|
+
"""
|
|
187
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
188
|
+
statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
|
|
189
|
+
|
|
190
|
+
successful_count = 0
|
|
191
|
+
last_cursor = cursor
|
|
192
|
+
|
|
193
|
+
for stmt in statements:
|
|
194
|
+
cursor.execute(stmt, normalize_execute_parameters(prepared_parameters))
|
|
195
|
+
successful_count += 1
|
|
196
|
+
|
|
197
|
+
return self.create_execution_result(
|
|
198
|
+
last_cursor, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
202
|
+
# TRANSACTION MANAGEMENT
|
|
203
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
204
|
+
|
|
205
|
+
def begin(self) -> None:
|
|
206
|
+
"""Begin a database transaction.
|
|
207
|
+
|
|
208
|
+
Raises:
|
|
209
|
+
SQLSpecError: If transaction cannot be started
|
|
210
|
+
"""
|
|
211
|
+
try:
|
|
212
|
+
if not self.connection.in_transaction:
|
|
213
|
+
self.connection.execute("BEGIN")
|
|
214
|
+
except sqlite3.Error as e:
|
|
215
|
+
msg = f"Failed to begin transaction: {e}"
|
|
216
|
+
raise SQLSpecError(msg) from e
|
|
217
|
+
|
|
218
|
+
def commit(self) -> None:
|
|
219
|
+
"""Commit the current transaction.
|
|
220
|
+
|
|
221
|
+
Raises:
|
|
222
|
+
SQLSpecError: If transaction cannot be committed
|
|
223
|
+
"""
|
|
224
|
+
try:
|
|
225
|
+
self.connection.commit()
|
|
226
|
+
except sqlite3.Error as e:
|
|
227
|
+
msg = f"Failed to commit transaction: {e}"
|
|
228
|
+
raise SQLSpecError(msg) from e
|
|
229
|
+
|
|
230
|
+
def rollback(self) -> None:
|
|
231
|
+
"""Rollback the current transaction.
|
|
232
|
+
|
|
233
|
+
Raises:
|
|
234
|
+
SQLSpecError: If transaction cannot be rolled back
|
|
235
|
+
"""
|
|
236
|
+
try:
|
|
237
|
+
self.connection.rollback()
|
|
238
|
+
except sqlite3.Error as e:
|
|
239
|
+
msg = f"Failed to rollback transaction: {e}"
|
|
240
|
+
raise SQLSpecError(msg) from e
|
|
241
|
+
|
|
242
|
+
def with_cursor(self, connection: "SqliteConnection") -> "SqliteCursor":
|
|
243
|
+
"""Create context manager for SQLite cursor.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
connection: SQLite database connection
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
Cursor context manager for safe cursor operations
|
|
250
|
+
"""
|
|
251
|
+
return SqliteCursor(connection)
|
|
252
|
+
|
|
253
|
+
def handle_database_exceptions(self) -> "SqliteExceptionHandler":
|
|
254
|
+
"""Handle database-specific exceptions and wrap them appropriately.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
Exception handler with deferred exception pattern for mypyc compatibility.
|
|
258
|
+
"""
|
|
259
|
+
return SqliteExceptionHandler()
|
|
260
|
+
|
|
261
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
262
|
+
# STORAGE API
|
|
263
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
264
|
+
|
|
265
|
+
def select_to_storage(
|
|
266
|
+
self,
|
|
267
|
+
statement: "SQL | str",
|
|
268
|
+
destination: "StorageDestination",
|
|
269
|
+
/,
|
|
270
|
+
*parameters: Any,
|
|
271
|
+
statement_config: "StatementConfig | None" = None,
|
|
272
|
+
partitioner: "dict[str, object] | None" = None,
|
|
273
|
+
format_hint: "StorageFormat | None" = None,
|
|
274
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
275
|
+
**kwargs: Any,
|
|
276
|
+
) -> "StorageBridgeJob":
|
|
277
|
+
"""Execute a query and write Arrow-compatible output to storage (sync)."""
|
|
278
|
+
|
|
279
|
+
self._require_capability("arrow_export_enabled")
|
|
280
|
+
arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
|
|
281
|
+
sync_pipeline = self._storage_pipeline()
|
|
282
|
+
telemetry_payload = self._write_result_to_storage_sync(
|
|
283
|
+
arrow_result, destination, format_hint=format_hint, pipeline=sync_pipeline
|
|
284
|
+
)
|
|
285
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
286
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
287
|
+
|
|
288
|
+
def load_from_arrow(
|
|
289
|
+
self,
|
|
290
|
+
table: str,
|
|
291
|
+
source: "ArrowResult | Any",
|
|
292
|
+
*,
|
|
293
|
+
partitioner: "dict[str, object] | None" = None,
|
|
294
|
+
overwrite: bool = False,
|
|
295
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
296
|
+
) -> "StorageBridgeJob":
|
|
297
|
+
"""Load Arrow data into SQLite using batched inserts."""
|
|
298
|
+
|
|
299
|
+
self._require_capability("arrow_import_enabled")
|
|
300
|
+
arrow_table = self._coerce_arrow_table(source)
|
|
301
|
+
if overwrite:
|
|
302
|
+
statement = f"DELETE FROM {format_identifier(table)}"
|
|
303
|
+
with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
|
|
304
|
+
cursor.execute(statement)
|
|
305
|
+
|
|
306
|
+
columns, records = self._arrow_table_to_rows(arrow_table)
|
|
307
|
+
if records:
|
|
308
|
+
insert_sql = build_insert_statement(table, columns)
|
|
309
|
+
with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
|
|
310
|
+
cursor.executemany(insert_sql, records)
|
|
311
|
+
|
|
312
|
+
telemetry_payload = self._build_ingest_telemetry(arrow_table)
|
|
313
|
+
telemetry_payload["destination"] = table
|
|
314
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
315
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
316
|
+
|
|
317
|
+
def load_from_storage(
|
|
318
|
+
self,
|
|
319
|
+
table: str,
|
|
320
|
+
source: "StorageDestination",
|
|
321
|
+
*,
|
|
322
|
+
file_format: "StorageFormat",
|
|
323
|
+
partitioner: "dict[str, object] | None" = None,
|
|
324
|
+
overwrite: bool = False,
|
|
325
|
+
) -> "StorageBridgeJob":
|
|
326
|
+
"""Load staged artifacts from storage into SQLite."""
|
|
327
|
+
|
|
328
|
+
arrow_table, inbound = self._read_arrow_from_storage_sync(source, file_format=file_format)
|
|
329
|
+
return self.load_from_arrow(table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound)
|
|
330
|
+
|
|
331
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
332
|
+
# UTILITY METHODS
|
|
333
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
334
|
+
|
|
335
|
+
@property
|
|
336
|
+
def data_dictionary(self) -> "SqliteDataDictionary":
|
|
337
|
+
"""Get the data dictionary for this driver.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
Data dictionary instance for metadata queries
|
|
341
|
+
"""
|
|
342
|
+
if self._data_dictionary is None:
|
|
343
|
+
self._data_dictionary = SqliteDataDictionary()
|
|
344
|
+
return self._data_dictionary
|
|
345
|
+
|
|
346
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
347
|
+
# PRIVATE/INTERNAL METHODS
|
|
348
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
349
|
+
|
|
350
|
+
def _connection_in_transaction(self) -> bool:
|
|
351
|
+
"""Check if connection is in transaction.
|
|
352
|
+
|
|
353
|
+
Returns:
|
|
354
|
+
True if connection is in an active transaction.
|
|
355
|
+
"""
|
|
356
|
+
return bool(self.connection.in_transaction)
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
register_driver_profile("sqlite", driver_profile)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""SQLite event queue store."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.adapters.sqlite.config import SqliteConfig
|
|
4
|
+
from sqlspec.extensions.events import BaseEventQueueStore
|
|
5
|
+
|
|
6
|
+
__all__ = ("SqliteEventQueueStore",)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SqliteEventQueueStore(BaseEventQueueStore[SqliteConfig]):
|
|
10
|
+
"""Provide SQLite-specific column types for the events queue.
|
|
11
|
+
|
|
12
|
+
SQLite stores JSON as TEXT since it lacks a native JSON column type.
|
|
13
|
+
JSON functions can still operate on TEXT columns containing valid JSON.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
__slots__ = ()
|
|
17
|
+
|
|
18
|
+
def _column_types(self) -> "tuple[str, str, str]":
|
|
19
|
+
"""Return SQLite-compatible column types for the event queue."""
|
|
20
|
+
return "TEXT", "TEXT", "TIMESTAMP"
|