sqlspec 0.47.0__cp314-cp314-win_amd64.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.
- f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
- sqlspec/__init__.py +167 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_typing.py +714 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +13 -0
- sqlspec/adapters/adbc/_typing.py +106 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1280 -0
- sqlspec/adapters/adbc/config.py +378 -0
- sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/core.py +922 -0
- sqlspec/adapters/adbc/data_dictionary.py +339 -0
- sqlspec/adapters/adbc/driver.py +534 -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 +534 -0
- sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/type_converter.py +142 -0
- sqlspec/adapters/aiomysql/__init__.py +21 -0
- sqlspec/adapters/aiomysql/_typing.py +137 -0
- sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
- sqlspec/adapters/aiomysql/adk/store.py +678 -0
- sqlspec/adapters/aiomysql/config.py +305 -0
- sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiomysql/core.py +536 -0
- sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
- sqlspec/adapters/aiomysql/driver.py +386 -0
- sqlspec/adapters/aiomysql/events/__init__.py +5 -0
- sqlspec/adapters/aiomysql/events/store.py +104 -0
- sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
- sqlspec/adapters/aiomysql/litestar/store.py +314 -0
- sqlspec/adapters/aiosqlite/__init__.py +26 -0
- sqlspec/adapters/aiosqlite/_typing.py +109 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +829 -0
- sqlspec/adapters/aiosqlite/config.py +315 -0
- sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
- sqlspec/adapters/aiosqlite/driver.py +311 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/pool.py +734 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +113 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +644 -0
- sqlspec/adapters/asyncmy/config.py +307 -0
- sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncmy/core.py +538 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
- sqlspec/adapters/asyncmy/driver.py +391 -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 +26 -0
- sqlspec/adapters/asyncpg/_typing.py +103 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +483 -0
- sqlspec/adapters/asyncpg/config.py +575 -0
- sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncpg/core.py +480 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/_hub.py +181 -0
- sqlspec/adapters/asyncpg/events/backend.py +210 -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 +15 -0
- sqlspec/adapters/bigquery/_typing.py +108 -0
- sqlspec/adapters/bigquery/config.py +362 -0
- sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/core.py +768 -0
- sqlspec/adapters/bigquery/data_dictionary.py +120 -0
- sqlspec/adapters/bigquery/driver.py +542 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
- sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +142 -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 +39 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
- sqlspec/adapters/cockroach_psycopg/config.py +511 -0
- sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +273 -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 +327 -0
- sqlspec/adapters/duckdb/__init__.py +29 -0
- sqlspec/adapters/duckdb/_typing.py +104 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +935 -0
- sqlspec/adapters/duckdb/config.py +386 -0
- sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/core.py +332 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +426 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/pool.py +350 -0
- sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mysqlconnector/__init__.py +39 -0
- sqlspec/adapters/mysqlconnector/_typing.py +186 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
- sqlspec/adapters/mysqlconnector/config.py +421 -0
- sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/mysqlconnector/core.py +472 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
- sqlspec/adapters/mysqlconnector/driver.py +516 -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 +39 -0
- sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_json_handlers.py +196 -0
- sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_param_types.py +46 -0
- sqlspec/adapters/oracledb/_typing.py +258 -0
- sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
- sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
- sqlspec/adapters/oracledb/adk/__init__.py +21 -0
- sqlspec/adapters/oracledb/adk/store.py +2453 -0
- sqlspec/adapters/oracledb/config.py +575 -0
- sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/core.py +820 -0
- sqlspec/adapters/oracledb/data_dictionary.py +404 -0
- sqlspec/adapters/oracledb/driver.py +1277 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/_hub.py +345 -0
- sqlspec/adapters/oracledb/events/backend.py +300 -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 +539 -0
- sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +18 -0
- sqlspec/adapters/psqlpy/_typing.py +121 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +591 -0
- sqlspec/adapters/psqlpy/config.py +376 -0
- sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/core.py +694 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
- sqlspec/adapters/psqlpy/driver.py +411 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/_hub.py +204 -0
- sqlspec/adapters/psqlpy/events/backend.py +210 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +38 -0
- sqlspec/adapters/psycopg/_typing.py +218 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1106 -0
- sqlspec/adapters/psycopg/config.py +695 -0
- sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/core.py +520 -0
- sqlspec/adapters/psycopg/data_dictionary.py +278 -0
- sqlspec/adapters/psycopg/driver.py +1033 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/_hub.py +388 -0
- sqlspec/adapters/psycopg/events/backend.py +398 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +554 -0
- sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +92 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +657 -0
- sqlspec/adapters/pymysql/config.py +176 -0
- sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/core.py +469 -0
- sqlspec/adapters/pymysql/data_dictionary.py +120 -0
- sqlspec/adapters/pymysql/driver.py +271 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/pool.py +184 -0
- sqlspec/adapters/spanner/__init__.py +33 -0
- sqlspec/adapters/spanner/_typing.py +102 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +758 -0
- sqlspec/adapters/spanner/config.py +355 -0
- sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/core.py +263 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/driver.py +407 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/type_converter.py +342 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +123 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +992 -0
- sqlspec/adapters/sqlite/config.py +240 -0
- sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/core.py +357 -0
- sqlspec/adapters/sqlite/data_dictionary.py +198 -0
- sqlspec/adapters/sqlite/driver.py +527 -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.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/pool.py +237 -0
- sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +832 -0
- sqlspec/builder/__init__.py +181 -0
- sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_base.py +1071 -0
- sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_ddl.py +1691 -0
- sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_dml.py +386 -0
- sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_factory.py +1884 -0
- sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_insert.py +405 -0
- sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_join.py +489 -0
- sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_merge.py +823 -0
- sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_parsing_utils.py +295 -0
- sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_select.py +1666 -0
- sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_temporal.py +167 -0
- sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_vector_distance.py +330 -0
- sqlspec/cli.py +1095 -0
- sqlspec/config.py +2383 -0
- sqlspec/core/__init__.py +372 -0
- sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/_pagination.py +42 -0
- sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_pool.py +76 -0
- sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
- sqlspec/core/cache.py +1085 -0
- sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
- sqlspec/core/compiler.py +1090 -0
- sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/core/config_runtime.py +174 -0
- sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
- sqlspec/core/filters.py +969 -0
- sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
- sqlspec/core/hashing.py +266 -0
- sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +72 -0
- sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_alignment.py +283 -0
- sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_converter.py +554 -0
- sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_processor.py +1182 -0
- sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_transformers.py +324 -0
- sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_types.py +536 -0
- sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_validator.py +171 -0
- sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/core/pipeline.py +333 -0
- sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/query_modifiers.py +508 -0
- sqlspec/core/result/__init__.py +25 -0
- sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_base.py +1232 -0
- sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/splitter.py +1021 -0
- sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/sqlcommenter.py +249 -0
- sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
- sqlspec/core/statement.py +1865 -0
- sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/type_converter.py +340 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_loader.py +138 -0
- sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +81 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
- sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +53 -0
- sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +197 -0
- sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +69 -0
- sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +59 -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/dialects/__init__.py +22 -0
- sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/_compat.py +14 -0
- sqlspec/dialects/postgres/__init__.py +9 -0
- sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_generators.py +57 -0
- sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_operators.py +81 -0
- sqlspec/dialects/postgres/_paradedb.py +50 -0
- sqlspec/dialects/postgres/_pgvector.py +36 -0
- sqlspec/dialects/spanner/__init__.py +6 -0
- sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/spanner/_generators.py +206 -0
- sqlspec/dialects/spanner/_spangres.py +77 -0
- sqlspec/dialects/spanner/_spanner.py +179 -0
- sqlspec/driver/__init__.py +49 -0
- sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_async.py +1830 -0
- sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_common.py +2292 -0
- sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_exception_handler.py +108 -0
- sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_query_cache.py +96 -0
- sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sql_helpers.py +139 -0
- sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_storage_helpers.py +153 -0
- sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sync.py +1817 -0
- sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
- sqlspec/exceptions.py +480 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +84 -0
- sqlspec/extensions/adk/_config_utils.py +199 -0
- sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/_types.py +41 -0
- sqlspec/extensions/adk/artifact/__init__.py +57 -0
- sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/artifact/_types.py +32 -0
- sqlspec/extensions/adk/artifact/service.py +508 -0
- sqlspec/extensions/adk/artifact/store.py +361 -0
- sqlspec/extensions/adk/converters.py +212 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +225 -0
- sqlspec/extensions/adk/memory/service.py +316 -0
- sqlspec/extensions/adk/memory/store.py +525 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +279 -0
- sqlspec/extensions/adk/store.py +590 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +462 -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 +22 -0
- sqlspec/extensions/fastapi/extension.py +391 -0
- sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/fastapi/providers.py +712 -0
- sqlspec/extensions/flask/__init__.py +38 -0
- sqlspec/extensions/flask/_state.py +87 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +539 -0
- sqlspec/extensions/litestar/__init__.py +31 -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 +1066 -0
- sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/litestar/providers.py +784 -0
- sqlspec/extensions/litestar/store.py +298 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/sanic/__init__.py +19 -0
- sqlspec/extensions/sanic/_state.py +43 -0
- sqlspec/extensions/sanic/_utils.py +127 -0
- sqlspec/extensions/sanic/extension.py +647 -0
- sqlspec/extensions/starlette/__init__.py +22 -0
- sqlspec/extensions/starlette/_state.py +42 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +374 -0
- sqlspec/extensions/starlette/middleware.py +281 -0
- sqlspec/loader.cp314-win_amd64.pyd +0 -0
- sqlspec/loader.py +727 -0
- sqlspec/migrations/__init__.py +39 -0
- sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/base.py +862 -0
- sqlspec/migrations/commands.py +2151 -0
- sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/runner.py +1195 -0
- sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/squash.py +490 -0
- sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/tracker.py +792 -0
- sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/validation.py +359 -0
- sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +57 -0
- sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_config.py +364 -0
- sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_dispatcher.py +200 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_observer.py +361 -0
- sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_runtime.py +461 -0
- sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +955 -0
- sqlspec/py.typed +0 -0
- sqlspec/service.py +433 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_arrow_payload.py +68 -0
- sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/_paths.py +58 -0
- sqlspec/storage/_utils.py +46 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/backends/base.py +374 -0
- sqlspec/storage/backends/fsspec.py +574 -0
- sqlspec/storage/backends/local.py +468 -0
- sqlspec/storage/backends/obstore.py +956 -0
- sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/errors.py +102 -0
- sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/pipeline.py +628 -0
- sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/registry.py +329 -0
- sqlspec/typing.py +405 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +384 -0
- sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/config_tools.py +314 -0
- sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/deprecation.py +157 -0
- sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/dispatch.py +101 -0
- sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/fixtures.py +260 -0
- sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/logging.py +251 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/portal.py +377 -0
- sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/schema.py +1040 -0
- sqlspec/utils/serializers/__init__.py +30 -0
- sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_json.py +415 -0
- sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_numpy.py +65 -0
- sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_schema.py +285 -0
- sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/sync_tools.py +316 -0
- sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/text.py +109 -0
- sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_converters.py +216 -0
- sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_guards.py +1508 -0
- sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/uuids.py +241 -0
- sqlspec-0.47.0.dist-info/METADATA +202 -0
- sqlspec-0.47.0.dist-info/RECORD +621 -0
- sqlspec-0.47.0.dist-info/WHEEL +4 -0
- sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
- sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
3
|
+
|
|
4
|
+
from sqlspec.exceptions import ImproperConfigurationError
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from sqlspec.config import DatabaseConfigProtocol
|
|
8
|
+
|
|
9
|
+
__all__ = ("CommitMode", "SQLSpecConfigState")
|
|
10
|
+
|
|
11
|
+
CommitMode = Literal["manual", "autocommit", "autocommit_include_redirect"]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class SQLSpecConfigState:
|
|
16
|
+
"""Internal state for each database configuration.
|
|
17
|
+
|
|
18
|
+
Tracks all configuration parameters needed for middleware and session management.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
config: "DatabaseConfigProtocol[Any, Any, Any]"
|
|
22
|
+
connection_key: str
|
|
23
|
+
pool_key: str
|
|
24
|
+
session_key: str
|
|
25
|
+
commit_mode: CommitMode
|
|
26
|
+
extra_commit_statuses: "set[int] | None"
|
|
27
|
+
extra_rollback_statuses: "set[int] | None"
|
|
28
|
+
disable_di: bool
|
|
29
|
+
enable_correlation_middleware: bool = False
|
|
30
|
+
correlation_header: str = "x-request-id"
|
|
31
|
+
correlation_headers: "tuple[str, ...] | None" = None
|
|
32
|
+
auto_trace_headers: bool = True
|
|
33
|
+
enable_sqlcommenter_middleware: bool = True
|
|
34
|
+
sqlcommenter_framework: str = "starlette"
|
|
35
|
+
|
|
36
|
+
def __post_init__(self) -> None:
|
|
37
|
+
"""Validate status configuration."""
|
|
38
|
+
extra_commit_statuses = self.extra_commit_statuses or set()
|
|
39
|
+
extra_rollback_statuses = self.extra_rollback_statuses or set()
|
|
40
|
+
if extra_commit_statuses & extra_rollback_statuses:
|
|
41
|
+
msg = "Extra rollback statuses and commit statuses must not share any status codes"
|
|
42
|
+
raise ImproperConfigurationError(msg)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
2
|
+
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
from starlette.requests import Request
|
|
5
|
+
|
|
6
|
+
from sqlspec.extensions.starlette._state import SQLSpecConfigState
|
|
7
|
+
|
|
8
|
+
__all__ = (
|
|
9
|
+
"get_connection_from_request",
|
|
10
|
+
"get_or_create_session",
|
|
11
|
+
"get_state_value",
|
|
12
|
+
"has_state_value",
|
|
13
|
+
"pop_state_value",
|
|
14
|
+
"set_state_value",
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
_MISSING = object()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _get_state_dict(state: Any) -> dict[str, Any]:
|
|
21
|
+
"""Return the underlying state dictionary."""
|
|
22
|
+
try:
|
|
23
|
+
return cast("dict[str, Any]", object.__getattribute__(state, "_state"))
|
|
24
|
+
except AttributeError:
|
|
25
|
+
return cast("dict[str, Any]", state.__dict__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_state_value(state: Any, key: str, default: Any = _MISSING) -> Any:
|
|
29
|
+
"""Get a value from a Starlette state object."""
|
|
30
|
+
data = _get_state_dict(state)
|
|
31
|
+
if default is _MISSING:
|
|
32
|
+
try:
|
|
33
|
+
return data[key]
|
|
34
|
+
except KeyError as exc:
|
|
35
|
+
msg = f"'{state.__class__.__name__}' object has no attribute '{key}'"
|
|
36
|
+
raise AttributeError(msg) from exc
|
|
37
|
+
return data.get(key, default)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def set_state_value(state: Any, key: str, value: Any) -> None:
|
|
41
|
+
"""Set a value on a Starlette state object."""
|
|
42
|
+
_get_state_dict(state)[key] = value
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def pop_state_value(state: Any, key: str) -> Any | None:
|
|
46
|
+
"""Remove a value from a Starlette state object."""
|
|
47
|
+
return _get_state_dict(state).pop(key, None)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def has_state_value(state: Any, key: str) -> bool:
|
|
51
|
+
"""Check if a Starlette state object has a stored value."""
|
|
52
|
+
return key in _get_state_dict(state)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get_connection_from_request(request: "Request", config_state: "SQLSpecConfigState") -> Any:
|
|
56
|
+
"""Get database connection from request state.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
request: Starlette request instance.
|
|
60
|
+
config_state: Configuration state for the database.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Database connection object.
|
|
64
|
+
"""
|
|
65
|
+
return get_state_value(request.state, config_state.connection_key)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def get_or_create_session(request: "Request", config_state: "SQLSpecConfigState") -> Any:
|
|
69
|
+
"""Get or create database session for request.
|
|
70
|
+
|
|
71
|
+
Sessions are cached per request to ensure the same session instance
|
|
72
|
+
is returned for multiple calls within the same request.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
request: Starlette request instance.
|
|
76
|
+
config_state: Configuration state for the database.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
Database session (driver instance).
|
|
80
|
+
"""
|
|
81
|
+
session_instance_key = f"{config_state.session_key}_instance"
|
|
82
|
+
|
|
83
|
+
existing_session = get_state_value(request.state, session_instance_key, None)
|
|
84
|
+
if existing_session is not None:
|
|
85
|
+
return existing_session
|
|
86
|
+
|
|
87
|
+
connection = get_connection_from_request(request, config_state)
|
|
88
|
+
|
|
89
|
+
session = config_state.config.driver_type(
|
|
90
|
+
connection=connection,
|
|
91
|
+
statement_config=config_state.config.statement_config,
|
|
92
|
+
driver_features=config_state.config.driver_features,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
set_state_value(request.state, session_instance_key, session)
|
|
96
|
+
return session
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from contextlib import asynccontextmanager
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from sqlspec.base import SQLSpec
|
|
6
|
+
from sqlspec.exceptions import ImproperConfigurationError
|
|
7
|
+
from sqlspec.extensions.starlette._state import SQLSpecConfigState
|
|
8
|
+
from sqlspec.extensions.starlette._utils import get_or_create_session, get_state_value
|
|
9
|
+
from sqlspec.extensions.starlette.middleware import (
|
|
10
|
+
CorrelationMiddleware,
|
|
11
|
+
SQLSpecAutocommitMiddleware,
|
|
12
|
+
SQLSpecManualMiddleware,
|
|
13
|
+
)
|
|
14
|
+
from sqlspec.utils.logging import get_logger, log_with_context
|
|
15
|
+
from sqlspec.utils.sync_tools import ensure_async_
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from collections.abc import AsyncGenerator
|
|
19
|
+
|
|
20
|
+
from starlette.applications import Starlette
|
|
21
|
+
from starlette.requests import Request
|
|
22
|
+
|
|
23
|
+
__all__ = ("SQLSpecPlugin",)
|
|
24
|
+
|
|
25
|
+
logger = get_logger("sqlspec.extensions.starlette")
|
|
26
|
+
|
|
27
|
+
DEFAULT_COMMIT_MODE = "manual"
|
|
28
|
+
DEFAULT_CONNECTION_KEY = "db_connection"
|
|
29
|
+
DEFAULT_POOL_KEY = "db_pool"
|
|
30
|
+
DEFAULT_SESSION_KEY = "db_session"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SQLSpecPlugin:
|
|
34
|
+
"""SQLSpec integration for Starlette applications.
|
|
35
|
+
|
|
36
|
+
Provides middleware-based session management, automatic transaction handling,
|
|
37
|
+
and connection pooling lifecycle management.
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
from starlette.applications import Starlette
|
|
41
|
+
from sqlspec import SQLSpec
|
|
42
|
+
from sqlspec.adapters.asyncpg import AsyncpgConfig
|
|
43
|
+
from sqlspec.extensions.starlette import SQLSpecPlugin
|
|
44
|
+
|
|
45
|
+
sqlspec = SQLSpec()
|
|
46
|
+
sqlspec.add_config(AsyncpgConfig(
|
|
47
|
+
bind_key="default",
|
|
48
|
+
connection_config={"dsn": "postgresql://localhost/mydb"},
|
|
49
|
+
extension_config={
|
|
50
|
+
"starlette": {
|
|
51
|
+
"commit_mode": "autocommit",
|
|
52
|
+
"session_key": "db"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
))
|
|
56
|
+
|
|
57
|
+
app = Starlette()
|
|
58
|
+
db_ext = SQLSpecPlugin(sqlspec, app)
|
|
59
|
+
|
|
60
|
+
@app.route("/users")
|
|
61
|
+
async def list_users(request):
|
|
62
|
+
db = db_ext.get_session(request)
|
|
63
|
+
result = await db.execute("SELECT * FROM users")
|
|
64
|
+
return JSONResponse({"users": result.all()})
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
__slots__ = ("_config_states", "_correlation_middleware_added", "_sqlcommenter_middleware_added", "_sqlspec")
|
|
68
|
+
|
|
69
|
+
def __init__(self, sqlspec: SQLSpec, app: "Starlette | None" = None) -> None:
|
|
70
|
+
"""Initialize SQLSpec Starlette extension.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
sqlspec: Pre-configured SQLSpec instance with registered configs.
|
|
74
|
+
app: Optional Starlette application to initialize immediately.
|
|
75
|
+
"""
|
|
76
|
+
self._sqlspec = sqlspec
|
|
77
|
+
self._config_states: list[SQLSpecConfigState] = []
|
|
78
|
+
self._correlation_middleware_added = False
|
|
79
|
+
self._sqlcommenter_middleware_added = False
|
|
80
|
+
|
|
81
|
+
for cfg in self._sqlspec.configs.values():
|
|
82
|
+
settings = self._extract_extension_settings(cfg)
|
|
83
|
+
state = self._create_config_state(cfg, settings)
|
|
84
|
+
self._config_states.append(state)
|
|
85
|
+
|
|
86
|
+
if app is not None:
|
|
87
|
+
self.init_app(app)
|
|
88
|
+
log_with_context(
|
|
89
|
+
logger,
|
|
90
|
+
logging.DEBUG,
|
|
91
|
+
"extension.init",
|
|
92
|
+
framework="starlette",
|
|
93
|
+
stage="init",
|
|
94
|
+
config_count=len(self._config_states),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def _extract_extension_settings(self, config: Any) -> "dict[str, Any]":
|
|
98
|
+
"""Extract Starlette settings from config.extension_config.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
config: Database configuration instance.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
Dictionary of Starlette-specific settings.
|
|
105
|
+
"""
|
|
106
|
+
starlette_config = config.extension_config.get("starlette", {})
|
|
107
|
+
|
|
108
|
+
connection_key = starlette_config.get("connection_key", DEFAULT_CONNECTION_KEY)
|
|
109
|
+
pool_key = starlette_config.get("pool_key", DEFAULT_POOL_KEY)
|
|
110
|
+
session_key = starlette_config.get("session_key", DEFAULT_SESSION_KEY)
|
|
111
|
+
commit_mode = starlette_config.get("commit_mode", DEFAULT_COMMIT_MODE)
|
|
112
|
+
|
|
113
|
+
if not config.supports_connection_pooling and pool_key == DEFAULT_POOL_KEY:
|
|
114
|
+
pool_key = f"_{DEFAULT_POOL_KEY}_{id(config)}"
|
|
115
|
+
|
|
116
|
+
enable_correlation = starlette_config.get("enable_correlation_middleware", False)
|
|
117
|
+
correlation_header = starlette_config.get("correlation_header", "x-request-id")
|
|
118
|
+
correlation_headers = starlette_config.get("correlation_headers")
|
|
119
|
+
if correlation_headers is not None:
|
|
120
|
+
correlation_headers = tuple(correlation_headers)
|
|
121
|
+
auto_trace_headers = starlette_config.get("auto_trace_headers", True)
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
"connection_key": connection_key,
|
|
125
|
+
"pool_key": pool_key,
|
|
126
|
+
"session_key": session_key,
|
|
127
|
+
"commit_mode": commit_mode,
|
|
128
|
+
"extra_commit_statuses": starlette_config.get("extra_commit_statuses"),
|
|
129
|
+
"extra_rollback_statuses": starlette_config.get("extra_rollback_statuses"),
|
|
130
|
+
"disable_di": starlette_config.get("disable_di", False),
|
|
131
|
+
"enable_correlation_middleware": enable_correlation,
|
|
132
|
+
"correlation_header": correlation_header,
|
|
133
|
+
"correlation_headers": correlation_headers,
|
|
134
|
+
"auto_trace_headers": auto_trace_headers,
|
|
135
|
+
"enable_sqlcommenter_middleware": starlette_config.get("enable_sqlcommenter_middleware", True),
|
|
136
|
+
"sqlcommenter_framework": starlette_config.get("sqlcommenter_framework", "starlette"),
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
def _create_config_state(self, config: Any, settings: "dict[str, Any]") -> SQLSpecConfigState:
|
|
140
|
+
"""Create configuration state object.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
config: Database configuration instance.
|
|
144
|
+
settings: Extracted framework settings.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Configuration state instance.
|
|
148
|
+
"""
|
|
149
|
+
return SQLSpecConfigState(
|
|
150
|
+
config=config,
|
|
151
|
+
connection_key=settings["connection_key"],
|
|
152
|
+
pool_key=settings["pool_key"],
|
|
153
|
+
session_key=settings["session_key"],
|
|
154
|
+
commit_mode=settings["commit_mode"],
|
|
155
|
+
extra_commit_statuses=settings["extra_commit_statuses"],
|
|
156
|
+
extra_rollback_statuses=settings["extra_rollback_statuses"],
|
|
157
|
+
disable_di=settings["disable_di"],
|
|
158
|
+
enable_correlation_middleware=settings["enable_correlation_middleware"],
|
|
159
|
+
correlation_header=settings["correlation_header"],
|
|
160
|
+
correlation_headers=settings["correlation_headers"],
|
|
161
|
+
auto_trace_headers=settings["auto_trace_headers"],
|
|
162
|
+
enable_sqlcommenter_middleware=settings["enable_sqlcommenter_middleware"],
|
|
163
|
+
sqlcommenter_framework=settings["sqlcommenter_framework"],
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
def init_app(self, app: "Starlette") -> None:
|
|
167
|
+
"""Initialize Starlette application with SQLSpec.
|
|
168
|
+
|
|
169
|
+
Validates configuration, wraps lifespan, and adds middleware.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
app: Starlette application instance.
|
|
173
|
+
"""
|
|
174
|
+
self._validate_unique_keys()
|
|
175
|
+
|
|
176
|
+
original_lifespan = app.router.lifespan_context
|
|
177
|
+
|
|
178
|
+
@asynccontextmanager
|
|
179
|
+
async def combined_lifespan(app: "Starlette") -> "AsyncGenerator[None, None]":
|
|
180
|
+
async with self.lifespan(app), original_lifespan(app):
|
|
181
|
+
yield
|
|
182
|
+
|
|
183
|
+
app.router.lifespan_context = combined_lifespan
|
|
184
|
+
|
|
185
|
+
for config_state in self._config_states:
|
|
186
|
+
if not config_state.disable_di:
|
|
187
|
+
self._add_middleware(app, config_state)
|
|
188
|
+
|
|
189
|
+
# Add correlation middleware if any config enables it (only add once)
|
|
190
|
+
self._add_correlation_middleware(app)
|
|
191
|
+
self._add_sqlcommenter_middleware(app)
|
|
192
|
+
|
|
193
|
+
log_with_context(
|
|
194
|
+
logger,
|
|
195
|
+
logging.DEBUG,
|
|
196
|
+
"extension.init",
|
|
197
|
+
framework="starlette",
|
|
198
|
+
stage="configured",
|
|
199
|
+
config_count=len(self._config_states),
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
def _validate_unique_keys(self) -> None:
|
|
203
|
+
"""Validate that all state keys are unique across configs.
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
ImproperConfigurationError: If duplicate keys found.
|
|
207
|
+
"""
|
|
208
|
+
all_keys: set[str] = set()
|
|
209
|
+
|
|
210
|
+
for state in self._config_states:
|
|
211
|
+
keys = {state.connection_key, state.pool_key, state.session_key}
|
|
212
|
+
duplicates = all_keys & keys
|
|
213
|
+
|
|
214
|
+
if duplicates:
|
|
215
|
+
msg = f"Duplicate state keys found: {duplicates}"
|
|
216
|
+
raise ImproperConfigurationError(msg)
|
|
217
|
+
|
|
218
|
+
all_keys.update(keys)
|
|
219
|
+
|
|
220
|
+
def _add_middleware(self, app: "Starlette", config_state: SQLSpecConfigState) -> None:
|
|
221
|
+
"""Add transaction middleware for configuration.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
app: Starlette application instance.
|
|
225
|
+
config_state: Configuration state.
|
|
226
|
+
"""
|
|
227
|
+
if config_state.commit_mode == "manual":
|
|
228
|
+
app.add_middleware(SQLSpecManualMiddleware, config_state=config_state)
|
|
229
|
+
elif config_state.commit_mode == "autocommit":
|
|
230
|
+
app.add_middleware(SQLSpecAutocommitMiddleware, config_state=config_state, include_redirect=False)
|
|
231
|
+
elif config_state.commit_mode == "autocommit_include_redirect":
|
|
232
|
+
app.add_middleware(SQLSpecAutocommitMiddleware, config_state=config_state, include_redirect=True)
|
|
233
|
+
|
|
234
|
+
def _add_correlation_middleware(self, app: "Starlette") -> None:
|
|
235
|
+
"""Add correlation middleware if any config enables it.
|
|
236
|
+
|
|
237
|
+
Only adds the middleware once, using settings from the first config
|
|
238
|
+
that enables it.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
app: Starlette application instance.
|
|
242
|
+
"""
|
|
243
|
+
if self._correlation_middleware_added:
|
|
244
|
+
return
|
|
245
|
+
|
|
246
|
+
# Find first config that enables correlation middleware
|
|
247
|
+
for config_state in self._config_states:
|
|
248
|
+
if config_state.enable_correlation_middleware:
|
|
249
|
+
app.add_middleware(
|
|
250
|
+
CorrelationMiddleware,
|
|
251
|
+
primary_header=config_state.correlation_header,
|
|
252
|
+
additional_headers=config_state.correlation_headers,
|
|
253
|
+
auto_trace_headers=config_state.auto_trace_headers,
|
|
254
|
+
)
|
|
255
|
+
self._correlation_middleware_added = True
|
|
256
|
+
log_with_context(
|
|
257
|
+
logger,
|
|
258
|
+
logging.DEBUG,
|
|
259
|
+
"extension.init",
|
|
260
|
+
framework="starlette",
|
|
261
|
+
stage="correlation_middleware",
|
|
262
|
+
primary_header=config_state.correlation_header,
|
|
263
|
+
)
|
|
264
|
+
break
|
|
265
|
+
|
|
266
|
+
def _add_sqlcommenter_middleware(self, app: "Starlette") -> None:
|
|
267
|
+
"""Add SQLCommenter middleware if any config enables it.
|
|
268
|
+
|
|
269
|
+
Only adds the middleware once, using the framework name from the first
|
|
270
|
+
config that enables it.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
app: Starlette application instance.
|
|
274
|
+
"""
|
|
275
|
+
if self._sqlcommenter_middleware_added:
|
|
276
|
+
return
|
|
277
|
+
|
|
278
|
+
for config_state in self._config_states:
|
|
279
|
+
if config_state.enable_sqlcommenter_middleware and config_state.config.statement_config.enable_sqlcommenter:
|
|
280
|
+
from sqlspec.extensions.starlette.middleware import SQLCommenterMiddleware
|
|
281
|
+
|
|
282
|
+
app.add_middleware(SQLCommenterMiddleware, framework=config_state.sqlcommenter_framework)
|
|
283
|
+
self._sqlcommenter_middleware_added = True
|
|
284
|
+
log_with_context(
|
|
285
|
+
logger, logging.DEBUG, "extension.init", framework="starlette", stage="sqlcommenter_middleware"
|
|
286
|
+
)
|
|
287
|
+
break
|
|
288
|
+
|
|
289
|
+
@asynccontextmanager
|
|
290
|
+
async def lifespan(self, app: "Starlette") -> "AsyncGenerator[None, None]":
|
|
291
|
+
"""Manage connection pool lifecycle.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
app: Starlette application instance.
|
|
295
|
+
|
|
296
|
+
Yields:
|
|
297
|
+
None
|
|
298
|
+
"""
|
|
299
|
+
for config_state in self._config_states:
|
|
300
|
+
if config_state.config.supports_connection_pooling:
|
|
301
|
+
pool = await ensure_async_(config_state.config.create_pool)()
|
|
302
|
+
setattr(app.state, config_state.pool_key, pool)
|
|
303
|
+
log_with_context(
|
|
304
|
+
logger,
|
|
305
|
+
logging.DEBUG,
|
|
306
|
+
"session.create",
|
|
307
|
+
framework="starlette",
|
|
308
|
+
session_key=config_state.session_key,
|
|
309
|
+
pool_key=config_state.pool_key,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
try:
|
|
313
|
+
yield
|
|
314
|
+
finally:
|
|
315
|
+
for config_state in self._config_states:
|
|
316
|
+
if config_state.config.supports_connection_pooling:
|
|
317
|
+
await ensure_async_(config_state.config.close_pool)()
|
|
318
|
+
log_with_context(
|
|
319
|
+
logger,
|
|
320
|
+
logging.DEBUG,
|
|
321
|
+
"session.close",
|
|
322
|
+
framework="starlette",
|
|
323
|
+
session_key=config_state.session_key,
|
|
324
|
+
pool_key=config_state.pool_key,
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
def get_session(self, request: "Request", key: "str | None" = None) -> Any:
|
|
328
|
+
"""Get or create database session for request.
|
|
329
|
+
|
|
330
|
+
Sessions are cached per request to ensure consistency.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
request: Starlette request instance.
|
|
334
|
+
key: Optional session key to retrieve specific database session.
|
|
335
|
+
|
|
336
|
+
Returns:
|
|
337
|
+
Database session (driver instance).
|
|
338
|
+
"""
|
|
339
|
+
config_state = self._config_states[0] if key is None else self._get_config_state_by_key(key)
|
|
340
|
+
|
|
341
|
+
return get_or_create_session(request, config_state)
|
|
342
|
+
|
|
343
|
+
def get_connection(self, request: "Request", key: "str | None" = None) -> Any:
|
|
344
|
+
"""Get database connection from request state.
|
|
345
|
+
|
|
346
|
+
Args:
|
|
347
|
+
request: Starlette request instance.
|
|
348
|
+
key: Optional session key to retrieve specific database connection.
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
Database connection object.
|
|
352
|
+
"""
|
|
353
|
+
config_state = self._config_states[0] if key is None else self._get_config_state_by_key(key)
|
|
354
|
+
|
|
355
|
+
return get_state_value(request.state, config_state.connection_key)
|
|
356
|
+
|
|
357
|
+
def _get_config_state_by_key(self, key: str) -> SQLSpecConfigState:
|
|
358
|
+
"""Get configuration state by session key.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
key: Session key to search for.
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
Configuration state matching the key.
|
|
365
|
+
|
|
366
|
+
Raises:
|
|
367
|
+
ValueError: If no configuration found with the specified key.
|
|
368
|
+
"""
|
|
369
|
+
for state in self._config_states:
|
|
370
|
+
if state.session_key == key:
|
|
371
|
+
return state
|
|
372
|
+
|
|
373
|
+
msg = f"No configuration found with session_key: {key}"
|
|
374
|
+
raise ValueError(msg)
|