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,539 @@
|
|
|
1
|
+
"""Flask extension for SQLSpec database integration."""
|
|
2
|
+
|
|
3
|
+
import atexit
|
|
4
|
+
import logging
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
6
|
+
|
|
7
|
+
from sqlspec.base import SQLSpec
|
|
8
|
+
from sqlspec.config import AsyncDatabaseConfig, NoPoolAsyncConfig
|
|
9
|
+
from sqlspec.core import CorrelationExtractor
|
|
10
|
+
from sqlspec.core.sqlcommenter import SQLCommenterContext
|
|
11
|
+
from sqlspec.exceptions import ImproperConfigurationError
|
|
12
|
+
from sqlspec.extensions.flask._state import FlaskConfigState
|
|
13
|
+
from sqlspec.extensions.flask._utils import (
|
|
14
|
+
get_context_value,
|
|
15
|
+
get_or_create_session,
|
|
16
|
+
has_context_value,
|
|
17
|
+
pop_context_value,
|
|
18
|
+
set_context_value,
|
|
19
|
+
)
|
|
20
|
+
from sqlspec.utils.correlation import CorrelationContext
|
|
21
|
+
from sqlspec.utils.logging import get_logger, log_with_context
|
|
22
|
+
from sqlspec.utils.portal import PortalProvider
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from flask import Flask, Response
|
|
26
|
+
|
|
27
|
+
__all__ = ("SQLSpecPlugin",)
|
|
28
|
+
|
|
29
|
+
logger = get_logger("sqlspec.extensions.flask")
|
|
30
|
+
|
|
31
|
+
DEFAULT_COMMIT_MODE: Literal["manual"] = "manual"
|
|
32
|
+
DEFAULT_SESSION_KEY = "db_session"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class SQLSpecPlugin:
|
|
36
|
+
"""Flask extension for SQLSpec database integration.
|
|
37
|
+
|
|
38
|
+
Provides request-scoped session management, automatic transaction handling,
|
|
39
|
+
and async adapter support via portal pattern.
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
from flask import Flask
|
|
43
|
+
from sqlspec import SQLSpec
|
|
44
|
+
from sqlspec.adapters.sqlite import SqliteConfig
|
|
45
|
+
from sqlspec.extensions.flask import SQLSpecPlugin
|
|
46
|
+
|
|
47
|
+
sqlspec = SQLSpec()
|
|
48
|
+
config = SqliteConfig(
|
|
49
|
+
connection_config={"database": "app.db"},
|
|
50
|
+
extension_config={
|
|
51
|
+
"flask": {
|
|
52
|
+
"commit_mode": "autocommit",
|
|
53
|
+
"session_key": "db"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
sqlspec.add_config(config)
|
|
58
|
+
|
|
59
|
+
app = Flask(__name__)
|
|
60
|
+
plugin = SQLSpecPlugin(sqlspec, app)
|
|
61
|
+
|
|
62
|
+
@app.route("/users")
|
|
63
|
+
def list_users():
|
|
64
|
+
db = plugin.get_session()
|
|
65
|
+
result = db.execute("SELECT * FROM users")
|
|
66
|
+
return {"users": result.all()}
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
def __init__(self, sqlspec: SQLSpec, app: "Flask | None" = None) -> None:
|
|
70
|
+
"""Initialize Flask extension with SQLSpec instance.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
sqlspec: SQLSpec instance with registered configs.
|
|
74
|
+
app: Optional Flask application to initialize immediately.
|
|
75
|
+
"""
|
|
76
|
+
self._sqlspec = sqlspec
|
|
77
|
+
self._config_states: list[FlaskConfigState] = []
|
|
78
|
+
self._portal: PortalProvider | None = None
|
|
79
|
+
self._has_async_configs = False
|
|
80
|
+
self._cleanup_registered = False
|
|
81
|
+
self._shutdown_complete = False
|
|
82
|
+
self._enable_correlation = False
|
|
83
|
+
self._enable_sqlcommenter = False
|
|
84
|
+
self._extractor: CorrelationExtractor | None = None
|
|
85
|
+
|
|
86
|
+
for cfg in self._sqlspec.configs.values():
|
|
87
|
+
state = self._create_config_state(cfg)
|
|
88
|
+
self._config_states.append(state)
|
|
89
|
+
|
|
90
|
+
if state.is_async:
|
|
91
|
+
self._has_async_configs = True
|
|
92
|
+
|
|
93
|
+
if state.enable_correlation_middleware and not self._enable_correlation:
|
|
94
|
+
self._enable_correlation = True
|
|
95
|
+
self._extractor = CorrelationExtractor(
|
|
96
|
+
primary_header=state.correlation_header,
|
|
97
|
+
additional_headers=state.correlation_headers,
|
|
98
|
+
auto_trace_headers=state.auto_trace_headers,
|
|
99
|
+
)
|
|
100
|
+
if (
|
|
101
|
+
state.enable_sqlcommenter_middleware
|
|
102
|
+
and state.config.statement_config.enable_sqlcommenter
|
|
103
|
+
and not self._enable_sqlcommenter
|
|
104
|
+
):
|
|
105
|
+
self._enable_sqlcommenter = True
|
|
106
|
+
|
|
107
|
+
if app is not None:
|
|
108
|
+
self.init_app(app)
|
|
109
|
+
|
|
110
|
+
def _create_config_state(self, config: Any) -> FlaskConfigState:
|
|
111
|
+
"""Create configuration state from database config.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
config: Database configuration instance.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
FlaskConfigState instance.
|
|
118
|
+
"""
|
|
119
|
+
flask_config = config.extension_config.get("flask", {})
|
|
120
|
+
|
|
121
|
+
session_key = flask_config.get("session_key", DEFAULT_SESSION_KEY)
|
|
122
|
+
connection_key = flask_config.get("connection_key", f"sqlspec_connection_{session_key}")
|
|
123
|
+
commit_mode = flask_config.get("commit_mode", DEFAULT_COMMIT_MODE)
|
|
124
|
+
extra_commit_statuses = flask_config.get("extra_commit_statuses")
|
|
125
|
+
extra_rollback_statuses = flask_config.get("extra_rollback_statuses")
|
|
126
|
+
disable_di = flask_config.get("disable_di", False)
|
|
127
|
+
|
|
128
|
+
enable_correlation = flask_config.get("enable_correlation_middleware", False)
|
|
129
|
+
correlation_header = flask_config.get("correlation_header", "x-request-id")
|
|
130
|
+
correlation_headers = flask_config.get("correlation_headers")
|
|
131
|
+
if correlation_headers is not None:
|
|
132
|
+
correlation_headers = tuple(correlation_headers)
|
|
133
|
+
auto_trace_headers = flask_config.get("auto_trace_headers", True)
|
|
134
|
+
enable_sqlcommenter = flask_config.get("enable_sqlcommenter_middleware", True)
|
|
135
|
+
|
|
136
|
+
is_async = isinstance(config, (AsyncDatabaseConfig, NoPoolAsyncConfig))
|
|
137
|
+
|
|
138
|
+
return FlaskConfigState(
|
|
139
|
+
config=config,
|
|
140
|
+
connection_key=connection_key,
|
|
141
|
+
session_key=session_key,
|
|
142
|
+
commit_mode=commit_mode,
|
|
143
|
+
extra_commit_statuses=extra_commit_statuses,
|
|
144
|
+
extra_rollback_statuses=extra_rollback_statuses,
|
|
145
|
+
is_async=is_async,
|
|
146
|
+
disable_di=disable_di,
|
|
147
|
+
enable_correlation_middleware=enable_correlation,
|
|
148
|
+
correlation_header=correlation_header,
|
|
149
|
+
correlation_headers=correlation_headers,
|
|
150
|
+
auto_trace_headers=auto_trace_headers,
|
|
151
|
+
enable_sqlcommenter_middleware=enable_sqlcommenter,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
def init_app(self, app: "Flask") -> None:
|
|
155
|
+
"""Initialize Flask application with SQLSpec.
|
|
156
|
+
|
|
157
|
+
Validates configuration, creates portal if needed, creates pools,
|
|
158
|
+
and registers hooks.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
app: Flask application to initialize.
|
|
162
|
+
|
|
163
|
+
Raises:
|
|
164
|
+
ImproperConfigurationError: If extension already registered or keys not unique.
|
|
165
|
+
"""
|
|
166
|
+
if "sqlspec" in app.extensions:
|
|
167
|
+
msg = "SQLSpec extension already registered on this Flask application"
|
|
168
|
+
raise ImproperConfigurationError(msg)
|
|
169
|
+
|
|
170
|
+
self._validate_unique_keys()
|
|
171
|
+
|
|
172
|
+
if self._has_async_configs:
|
|
173
|
+
self._portal = PortalProvider()
|
|
174
|
+
self._portal.start()
|
|
175
|
+
log_with_context(logger, logging.DEBUG, "extension.init", framework="flask", stage="portal_started")
|
|
176
|
+
|
|
177
|
+
pools: dict[str, Any] = {}
|
|
178
|
+
for config_state in self._config_states:
|
|
179
|
+
if config_state.config.supports_connection_pooling:
|
|
180
|
+
if config_state.is_async:
|
|
181
|
+
pool = self._portal.portal.call(config_state.config.create_pool) # type: ignore[union-attr,arg-type]
|
|
182
|
+
else:
|
|
183
|
+
pool = config_state.config.create_pool()
|
|
184
|
+
pools[config_state.session_key] = pool
|
|
185
|
+
log_with_context(
|
|
186
|
+
logger, logging.DEBUG, "session.create", framework="flask", session_key=config_state.session_key
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
app.extensions["sqlspec"] = {"plugin": self, "pools": pools}
|
|
190
|
+
|
|
191
|
+
if any(not state.disable_di for state in self._config_states):
|
|
192
|
+
app.before_request(self._before_request_handler)
|
|
193
|
+
app.after_request(self._after_request_handler)
|
|
194
|
+
app.teardown_appcontext(self._teardown_appcontext_handler)
|
|
195
|
+
|
|
196
|
+
self._register_shutdown_hook()
|
|
197
|
+
|
|
198
|
+
log_with_context(
|
|
199
|
+
logger,
|
|
200
|
+
logging.DEBUG,
|
|
201
|
+
"extension.init",
|
|
202
|
+
framework="flask",
|
|
203
|
+
stage="configured",
|
|
204
|
+
config_count=len(self._config_states),
|
|
205
|
+
async_enabled=self._has_async_configs,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
def _validate_unique_keys(self) -> None:
|
|
209
|
+
"""Validate that all state keys are unique across configs.
|
|
210
|
+
|
|
211
|
+
Raises:
|
|
212
|
+
ImproperConfigurationError: If duplicate keys found.
|
|
213
|
+
"""
|
|
214
|
+
all_keys: set[str] = set()
|
|
215
|
+
|
|
216
|
+
for state in self._config_states:
|
|
217
|
+
keys = {state.connection_key, state.session_key}
|
|
218
|
+
duplicates = all_keys & keys
|
|
219
|
+
|
|
220
|
+
if duplicates:
|
|
221
|
+
msg = f"Duplicate state keys found: {duplicates}. Use unique session_key values."
|
|
222
|
+
raise ImproperConfigurationError(msg)
|
|
223
|
+
|
|
224
|
+
all_keys.update(keys)
|
|
225
|
+
|
|
226
|
+
def _register_shutdown_hook(self) -> None:
|
|
227
|
+
"""Register shutdown hook for pool and portal cleanup."""
|
|
228
|
+
|
|
229
|
+
if self._cleanup_registered:
|
|
230
|
+
return
|
|
231
|
+
|
|
232
|
+
atexit.register(self.shutdown)
|
|
233
|
+
self._cleanup_registered = True
|
|
234
|
+
|
|
235
|
+
def _before_request_handler(self) -> None:
|
|
236
|
+
"""Acquire connection before request.
|
|
237
|
+
|
|
238
|
+
Stores connection in Flask g object for each configured database.
|
|
239
|
+
Also stores context managers for proper cleanup.
|
|
240
|
+
Extracts correlation ID if correlation middleware is enabled.
|
|
241
|
+
"""
|
|
242
|
+
from flask import current_app, g, request
|
|
243
|
+
|
|
244
|
+
if self._enable_correlation and self._extractor is not None:
|
|
245
|
+
correlation_id = self._extractor.extract(lambda h: request.headers.get(h))
|
|
246
|
+
set_context_value(g, "correlation_id", correlation_id)
|
|
247
|
+
CorrelationContext.set(correlation_id)
|
|
248
|
+
|
|
249
|
+
if self._enable_sqlcommenter:
|
|
250
|
+
attrs: dict[str, str] = {"route": request.path, "framework": "flask"}
|
|
251
|
+
endpoint = request.endpoint
|
|
252
|
+
if endpoint is not None:
|
|
253
|
+
attrs["action"] = endpoint
|
|
254
|
+
SQLCommenterContext.set(attrs)
|
|
255
|
+
|
|
256
|
+
for config_state in self._config_states:
|
|
257
|
+
if config_state.disable_di:
|
|
258
|
+
continue
|
|
259
|
+
|
|
260
|
+
if config_state.config.supports_connection_pooling:
|
|
261
|
+
pool = current_app.extensions["sqlspec"]["pools"][config_state.session_key]
|
|
262
|
+
conn_ctx = config_state.config.provide_connection(pool)
|
|
263
|
+
|
|
264
|
+
if config_state.is_async:
|
|
265
|
+
connection = self._portal.portal.call(conn_ctx.__aenter__) # type: ignore[union-attr]
|
|
266
|
+
else:
|
|
267
|
+
connection = conn_ctx.__enter__() # type: ignore[union-attr]
|
|
268
|
+
|
|
269
|
+
set_context_value(g, f"{config_state.connection_key}_ctx", conn_ctx)
|
|
270
|
+
elif config_state.is_async:
|
|
271
|
+
connection = self._portal.portal.call(config_state.config.create_connection) # type: ignore[union-attr,arg-type]
|
|
272
|
+
else:
|
|
273
|
+
connection = config_state.config.create_connection()
|
|
274
|
+
|
|
275
|
+
set_context_value(g, config_state.connection_key, connection)
|
|
276
|
+
|
|
277
|
+
def _after_request_handler(self, response: "Response") -> "Response":
|
|
278
|
+
"""Handle transaction after request based on response status.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
response: Flask response object.
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
Response object with correlation ID header if enabled.
|
|
285
|
+
"""
|
|
286
|
+
from flask import g
|
|
287
|
+
|
|
288
|
+
if self._enable_correlation:
|
|
289
|
+
correlation_id = get_context_value(g, "correlation_id", None)
|
|
290
|
+
if correlation_id:
|
|
291
|
+
response.headers["X-Correlation-ID"] = correlation_id
|
|
292
|
+
|
|
293
|
+
for config_state in self._config_states:
|
|
294
|
+
if config_state.disable_di:
|
|
295
|
+
continue
|
|
296
|
+
|
|
297
|
+
if config_state.commit_mode == "manual":
|
|
298
|
+
continue
|
|
299
|
+
|
|
300
|
+
cache_key = f"sqlspec_session_cache_{config_state.session_key}"
|
|
301
|
+
session = get_context_value(g, cache_key, None)
|
|
302
|
+
|
|
303
|
+
if session is None:
|
|
304
|
+
continue
|
|
305
|
+
|
|
306
|
+
if config_state.should_commit(response.status_code):
|
|
307
|
+
self._execute_commit(session, config_state)
|
|
308
|
+
elif config_state.should_rollback(response.status_code):
|
|
309
|
+
self._execute_rollback(session, config_state)
|
|
310
|
+
|
|
311
|
+
return response
|
|
312
|
+
|
|
313
|
+
def _teardown_appcontext_handler(self, _exc: "BaseException | None" = None) -> None:
|
|
314
|
+
"""Clean up connections when request context ends.
|
|
315
|
+
|
|
316
|
+
Closes all connections, cleans up g object, and clears correlation context.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
_exc: Exception that occurred (if any).
|
|
320
|
+
"""
|
|
321
|
+
from flask import g
|
|
322
|
+
|
|
323
|
+
if self._enable_correlation:
|
|
324
|
+
CorrelationContext.clear()
|
|
325
|
+
if has_context_value(g, "correlation_id"):
|
|
326
|
+
pop_context_value(g, "correlation_id")
|
|
327
|
+
|
|
328
|
+
if self._enable_sqlcommenter:
|
|
329
|
+
SQLCommenterContext.set(None)
|
|
330
|
+
|
|
331
|
+
for config_state in self._config_states:
|
|
332
|
+
if config_state.disable_di:
|
|
333
|
+
continue
|
|
334
|
+
|
|
335
|
+
connection = get_context_value(g, config_state.connection_key, None)
|
|
336
|
+
ctx_key = f"{config_state.connection_key}_ctx"
|
|
337
|
+
conn_ctx = get_context_value(g, ctx_key, None)
|
|
338
|
+
|
|
339
|
+
if connection is not None:
|
|
340
|
+
try:
|
|
341
|
+
if conn_ctx is not None:
|
|
342
|
+
if config_state.is_async:
|
|
343
|
+
self._portal.portal.call(conn_ctx.__aexit__, None, None, None) # type: ignore[union-attr]
|
|
344
|
+
else:
|
|
345
|
+
conn_ctx.__exit__(None, None, None)
|
|
346
|
+
elif config_state.is_async:
|
|
347
|
+
self._portal.portal.call(connection.close) # type: ignore[union-attr]
|
|
348
|
+
else:
|
|
349
|
+
connection.close()
|
|
350
|
+
except Exception as exc:
|
|
351
|
+
log_with_context(
|
|
352
|
+
logger,
|
|
353
|
+
logging.ERROR,
|
|
354
|
+
"session.close",
|
|
355
|
+
framework="flask",
|
|
356
|
+
session_key=config_state.session_key,
|
|
357
|
+
operation="connection",
|
|
358
|
+
status="failed",
|
|
359
|
+
error_type=type(exc).__name__,
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
if has_context_value(g, config_state.connection_key):
|
|
363
|
+
pop_context_value(g, config_state.connection_key)
|
|
364
|
+
if has_context_value(g, ctx_key):
|
|
365
|
+
pop_context_value(g, ctx_key)
|
|
366
|
+
|
|
367
|
+
cache_key = f"sqlspec_session_cache_{config_state.session_key}"
|
|
368
|
+
if has_context_value(g, cache_key):
|
|
369
|
+
pop_context_value(g, cache_key)
|
|
370
|
+
|
|
371
|
+
def get_session(self, key: "str | None" = None) -> Any:
|
|
372
|
+
"""Get or create database session for current request.
|
|
373
|
+
|
|
374
|
+
Sessions are cached per request for consistency.
|
|
375
|
+
|
|
376
|
+
Args:
|
|
377
|
+
key: Session key for multi-database configs. Defaults to first config if None.
|
|
378
|
+
|
|
379
|
+
Returns:
|
|
380
|
+
Database session (driver instance).
|
|
381
|
+
"""
|
|
382
|
+
config_state = self._config_states[0] if key is None else self._get_config_state_by_key(key)
|
|
383
|
+
|
|
384
|
+
return get_or_create_session(config_state, self._portal.portal if self._portal else None)
|
|
385
|
+
|
|
386
|
+
def get_connection(self, key: "str | None" = None) -> Any:
|
|
387
|
+
"""Get database connection for current request.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
key: Session key for multi-database configs. Defaults to first config if None.
|
|
391
|
+
|
|
392
|
+
Returns:
|
|
393
|
+
Raw database connection.
|
|
394
|
+
"""
|
|
395
|
+
from flask import g
|
|
396
|
+
|
|
397
|
+
config_state = self._config_states[0] if key is None else self._get_config_state_by_key(key)
|
|
398
|
+
|
|
399
|
+
return get_context_value(g, config_state.connection_key)
|
|
400
|
+
|
|
401
|
+
def _get_config_state_by_key(self, key: str) -> FlaskConfigState:
|
|
402
|
+
"""Get config state by session key.
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
key: Session key to look up.
|
|
406
|
+
|
|
407
|
+
Returns:
|
|
408
|
+
FlaskConfigState for the key.
|
|
409
|
+
|
|
410
|
+
Raises:
|
|
411
|
+
ImproperConfigurationError: If key not found.
|
|
412
|
+
"""
|
|
413
|
+
for state in self._config_states:
|
|
414
|
+
if state.session_key == key:
|
|
415
|
+
return state
|
|
416
|
+
|
|
417
|
+
msg = f"No configuration found for key: {key}"
|
|
418
|
+
raise ImproperConfigurationError(msg)
|
|
419
|
+
|
|
420
|
+
def shutdown(self) -> None:
|
|
421
|
+
"""Dispose connection pools and stop async portal."""
|
|
422
|
+
|
|
423
|
+
if self._shutdown_complete:
|
|
424
|
+
return
|
|
425
|
+
|
|
426
|
+
self._shutdown_complete = True
|
|
427
|
+
|
|
428
|
+
for config_state in self._config_states:
|
|
429
|
+
if config_state.config.supports_connection_pooling:
|
|
430
|
+
self._close_pool_state(config_state)
|
|
431
|
+
|
|
432
|
+
if self._portal is not None:
|
|
433
|
+
try:
|
|
434
|
+
self._portal.stop()
|
|
435
|
+
except Exception as exc:
|
|
436
|
+
log_with_context(
|
|
437
|
+
logger,
|
|
438
|
+
logging.ERROR,
|
|
439
|
+
"extension.init",
|
|
440
|
+
framework="flask",
|
|
441
|
+
stage="shutdown",
|
|
442
|
+
status="failed",
|
|
443
|
+
error_type=type(exc).__name__,
|
|
444
|
+
)
|
|
445
|
+
finally:
|
|
446
|
+
self._portal = None
|
|
447
|
+
|
|
448
|
+
def _close_pool_state(self, config_state: FlaskConfigState) -> None:
|
|
449
|
+
"""Close pool associated with configuration state."""
|
|
450
|
+
|
|
451
|
+
try:
|
|
452
|
+
if config_state.is_async:
|
|
453
|
+
if self._portal is None:
|
|
454
|
+
log_with_context(
|
|
455
|
+
logger,
|
|
456
|
+
logging.DEBUG,
|
|
457
|
+
"session.close",
|
|
458
|
+
framework="flask",
|
|
459
|
+
session_key=config_state.session_key,
|
|
460
|
+
operation="pool",
|
|
461
|
+
status="skipped",
|
|
462
|
+
reason="portal_not_initialized",
|
|
463
|
+
)
|
|
464
|
+
return
|
|
465
|
+
_ = self._portal.portal.call(config_state.config.close_pool) # type: ignore[arg-type]
|
|
466
|
+
else:
|
|
467
|
+
config_state.config.close_pool()
|
|
468
|
+
log_with_context(
|
|
469
|
+
logger,
|
|
470
|
+
logging.DEBUG,
|
|
471
|
+
"session.close",
|
|
472
|
+
framework="flask",
|
|
473
|
+
session_key=config_state.session_key,
|
|
474
|
+
operation="pool",
|
|
475
|
+
status="complete",
|
|
476
|
+
)
|
|
477
|
+
except Exception as exc:
|
|
478
|
+
log_with_context(
|
|
479
|
+
logger,
|
|
480
|
+
logging.ERROR,
|
|
481
|
+
"session.close",
|
|
482
|
+
framework="flask",
|
|
483
|
+
session_key=config_state.session_key,
|
|
484
|
+
operation="pool",
|
|
485
|
+
status="failed",
|
|
486
|
+
error_type=type(exc).__name__,
|
|
487
|
+
)
|
|
488
|
+
|
|
489
|
+
def _execute_commit(self, session: Any, config_state: FlaskConfigState) -> None:
|
|
490
|
+
"""Execute commit on session.
|
|
491
|
+
|
|
492
|
+
Args:
|
|
493
|
+
session: Database session.
|
|
494
|
+
config_state: Configuration state.
|
|
495
|
+
"""
|
|
496
|
+
try:
|
|
497
|
+
if config_state.is_async:
|
|
498
|
+
connection = self.get_connection(config_state.session_key)
|
|
499
|
+
self._portal.portal.call(connection.commit) # type: ignore[union-attr]
|
|
500
|
+
else:
|
|
501
|
+
connection = self.get_connection(config_state.session_key)
|
|
502
|
+
connection.commit()
|
|
503
|
+
except Exception as exc:
|
|
504
|
+
log_with_context(
|
|
505
|
+
logger,
|
|
506
|
+
logging.ERROR,
|
|
507
|
+
"session.close",
|
|
508
|
+
framework="flask",
|
|
509
|
+
session_key=config_state.session_key,
|
|
510
|
+
operation="commit",
|
|
511
|
+
status="failed",
|
|
512
|
+
error_type=type(exc).__name__,
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
def _execute_rollback(self, session: Any, config_state: FlaskConfigState) -> None:
|
|
516
|
+
"""Execute rollback on session.
|
|
517
|
+
|
|
518
|
+
Args:
|
|
519
|
+
session: Database session.
|
|
520
|
+
config_state: Configuration state.
|
|
521
|
+
"""
|
|
522
|
+
try:
|
|
523
|
+
if config_state.is_async:
|
|
524
|
+
connection = self.get_connection(config_state.session_key)
|
|
525
|
+
self._portal.portal.call(connection.rollback) # type: ignore[union-attr]
|
|
526
|
+
else:
|
|
527
|
+
connection = self.get_connection(config_state.session_key)
|
|
528
|
+
connection.rollback()
|
|
529
|
+
except Exception as exc:
|
|
530
|
+
log_with_context(
|
|
531
|
+
logger,
|
|
532
|
+
logging.DEBUG,
|
|
533
|
+
"session.close",
|
|
534
|
+
framework="flask",
|
|
535
|
+
session_key=config_state.session_key,
|
|
536
|
+
operation="rollback",
|
|
537
|
+
status="failed",
|
|
538
|
+
error_type=type(exc).__name__,
|
|
539
|
+
)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from sqlspec.extensions.litestar._utils import get_sqlspec_scope_state, set_sqlspec_scope_state
|
|
2
|
+
from sqlspec.extensions.litestar.channels import SQLSpecChannelsBackend
|
|
3
|
+
from sqlspec.extensions.litestar.cli import database_group
|
|
4
|
+
from sqlspec.extensions.litestar.config import LitestarConfig
|
|
5
|
+
from sqlspec.extensions.litestar.plugin import (
|
|
6
|
+
DEFAULT_COMMIT_MODE,
|
|
7
|
+
DEFAULT_CONNECTION_KEY,
|
|
8
|
+
DEFAULT_POOL_KEY,
|
|
9
|
+
DEFAULT_SESSION_KEY,
|
|
10
|
+
CommitMode,
|
|
11
|
+
SQLSpecPlugin,
|
|
12
|
+
)
|
|
13
|
+
from sqlspec.extensions.litestar.store import BaseSQLSpecStore
|
|
14
|
+
from sqlspec.service import SQLSpecAsyncService, SQLSpecSyncService
|
|
15
|
+
|
|
16
|
+
__all__ = (
|
|
17
|
+
"DEFAULT_COMMIT_MODE",
|
|
18
|
+
"DEFAULT_CONNECTION_KEY",
|
|
19
|
+
"DEFAULT_POOL_KEY",
|
|
20
|
+
"DEFAULT_SESSION_KEY",
|
|
21
|
+
"BaseSQLSpecStore",
|
|
22
|
+
"CommitMode",
|
|
23
|
+
"LitestarConfig",
|
|
24
|
+
"SQLSpecAsyncService",
|
|
25
|
+
"SQLSpecChannelsBackend",
|
|
26
|
+
"SQLSpecPlugin",
|
|
27
|
+
"SQLSpecSyncService",
|
|
28
|
+
"database_group",
|
|
29
|
+
"get_sqlspec_scope_state",
|
|
30
|
+
"set_sqlspec_scope_state",
|
|
31
|
+
)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Any
|
|
2
|
+
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
from litestar.types import Scope
|
|
5
|
+
|
|
6
|
+
__all__ = ("delete_sqlspec_scope_state", "get_sqlspec_scope_state", "set_sqlspec_scope_state")
|
|
7
|
+
|
|
8
|
+
_SCOPE_NAMESPACE = "_sqlspec"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_sqlspec_scope_state(scope: "Scope", key: str, default: Any = None, pop: bool = False) -> Any:
|
|
12
|
+
"""Get an internal value from connection scope state.
|
|
13
|
+
|
|
14
|
+
Note:
|
|
15
|
+
If called with a default value, this method behaves like `dict.setdefault()`, both setting the key in the
|
|
16
|
+
namespace to the default value, and returning it.
|
|
17
|
+
|
|
18
|
+
If called without a default value, the method behaves like `dict.get()`, returning ``None`` if the key does not
|
|
19
|
+
exist.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
scope: The connection scope.
|
|
23
|
+
key: Key to get from internal namespace in scope state.
|
|
24
|
+
default: Default value to return.
|
|
25
|
+
pop: Boolean flag dictating whether the value should be deleted from the state.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Value mapped to ``key`` in internal connection scope namespace.
|
|
29
|
+
"""
|
|
30
|
+
namespace = scope.setdefault(_SCOPE_NAMESPACE, {}) # type: ignore[misc]
|
|
31
|
+
return namespace.pop(key, default) if pop else namespace.get(key, default) # pyright: ignore[reportUnknownVariableType,reportUnknownMemberType]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def set_sqlspec_scope_state(scope: "Scope", key: str, value: Any) -> None:
|
|
35
|
+
"""Set an internal value in connection scope state.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
scope: The connection scope.
|
|
39
|
+
key: Key to set under internal namespace in scope state.
|
|
40
|
+
value: Value for key.
|
|
41
|
+
"""
|
|
42
|
+
scope.setdefault(_SCOPE_NAMESPACE, {})[key] = value # type: ignore[misc]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def delete_sqlspec_scope_state(scope: "Scope", key: str) -> None:
|
|
46
|
+
"""Remove an internal value from connection scope state.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
scope: The connection scope.
|
|
50
|
+
key: Key to set under internal namespace in scope state.
|
|
51
|
+
"""
|
|
52
|
+
del scope.setdefault(_SCOPE_NAMESPACE, {})[key] # type: ignore[misc]
|