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,480 @@
|
|
|
1
|
+
"""AsyncPG adapter compiled helpers."""
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
import importlib
|
|
5
|
+
import re
|
|
6
|
+
from collections.abc import Sized
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Final, NamedTuple
|
|
8
|
+
|
|
9
|
+
import asyncpg
|
|
10
|
+
|
|
11
|
+
from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
|
|
12
|
+
from sqlspec.core.config_runtime import (
|
|
13
|
+
build_postgres_extension_probe_names,
|
|
14
|
+
resolve_postgres_extension_state,
|
|
15
|
+
resolve_runtime_statement_config,
|
|
16
|
+
)
|
|
17
|
+
from sqlspec.exceptions import (
|
|
18
|
+
CheckViolationError,
|
|
19
|
+
ConnectionTimeoutError,
|
|
20
|
+
DeadlockError,
|
|
21
|
+
ForeignKeyViolationError,
|
|
22
|
+
IntegrityError,
|
|
23
|
+
NotNullViolationError,
|
|
24
|
+
PermissionDeniedError,
|
|
25
|
+
QueryTimeoutError,
|
|
26
|
+
SerializationConflictError,
|
|
27
|
+
SQLParsingError,
|
|
28
|
+
SQLSpecError,
|
|
29
|
+
UniqueViolationError,
|
|
30
|
+
map_sqlstate_to_exception,
|
|
31
|
+
)
|
|
32
|
+
from sqlspec.typing import PGVECTOR_INSTALLED
|
|
33
|
+
from sqlspec.utils.dispatch import TypeDispatcher
|
|
34
|
+
from sqlspec.utils.logging import get_logger
|
|
35
|
+
from sqlspec.utils.serializers import from_json, to_json
|
|
36
|
+
from sqlspec.utils.type_converters import build_uuid_coercions
|
|
37
|
+
from sqlspec.utils.type_guards import has_sqlstate
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from collections.abc import Callable, Mapping
|
|
41
|
+
|
|
42
|
+
from sqlspec.core import SQL, ParameterStyleConfig, StackOperation
|
|
43
|
+
|
|
44
|
+
__all__ = (
|
|
45
|
+
"NormalizedStackOperation",
|
|
46
|
+
"apply_driver_features",
|
|
47
|
+
"build_connection_config",
|
|
48
|
+
"build_postgres_extension_probe_names",
|
|
49
|
+
"build_profile",
|
|
50
|
+
"build_statement_config",
|
|
51
|
+
"collect_rows",
|
|
52
|
+
"configure_parameter_serializers",
|
|
53
|
+
"create_mapped_exception",
|
|
54
|
+
"default_statement_config",
|
|
55
|
+
"driver_profile",
|
|
56
|
+
"invoke_prepared_statement",
|
|
57
|
+
"parse_status",
|
|
58
|
+
"register_json_codecs",
|
|
59
|
+
"register_pgvector_support",
|
|
60
|
+
"resolve_many_rowcount",
|
|
61
|
+
"resolve_postgres_extension_state",
|
|
62
|
+
"resolve_runtime_statement_config",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
ASYNC_PG_STATUS_REGEX: "re.Pattern[str]" = re.compile(r"^([A-Z]+)(?:\s+(\d+))?\s+(\d+)$", re.IGNORECASE)
|
|
66
|
+
EXPECTED_REGEX_GROUPS = 3
|
|
67
|
+
|
|
68
|
+
logger = get_logger("sqlspec.adapters.asyncpg.core")
|
|
69
|
+
_PGVECTOR_MISSING_LOGGED = False
|
|
70
|
+
_JSONB_BINARY_VERSION = b"\x01"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class NormalizedStackOperation(NamedTuple):
|
|
74
|
+
"""Normalized execution metadata used for prepared stack operations."""
|
|
75
|
+
|
|
76
|
+
operation: "StackOperation"
|
|
77
|
+
statement: "SQL"
|
|
78
|
+
sql: str
|
|
79
|
+
parameters: "tuple[Any, ...] | dict[str, Any] | None"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
PREPARED_STATEMENT_CACHE_SIZE: Final[int] = 32
|
|
83
|
+
_EXCEPTION_MAPPING_DISPATCHER = TypeDispatcher["tuple[str, type[SQLSpecError], str]"]()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _convert_datetime_param(value: Any) -> Any:
|
|
87
|
+
"""Convert datetime parameter, handling ISO strings."""
|
|
88
|
+
|
|
89
|
+
if isinstance(value, str):
|
|
90
|
+
return datetime.datetime.fromisoformat(value)
|
|
91
|
+
return value
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _convert_date_param(value: Any) -> Any:
|
|
95
|
+
"""Convert date parameter, handling ISO strings."""
|
|
96
|
+
|
|
97
|
+
if isinstance(value, str):
|
|
98
|
+
return datetime.date.fromisoformat(value)
|
|
99
|
+
return value
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _convert_time_param(value: Any) -> Any:
|
|
103
|
+
"""Convert time parameter, handling ISO strings."""
|
|
104
|
+
|
|
105
|
+
if isinstance(value, str):
|
|
106
|
+
return datetime.time.fromisoformat(value)
|
|
107
|
+
return value
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _build_asyncpg_custom_type_coercions() -> "dict[type, Callable[[Any], Any]]":
|
|
111
|
+
"""Return custom type coercions for AsyncPG."""
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
datetime.datetime: _convert_datetime_param,
|
|
115
|
+
datetime.date: _convert_date_param,
|
|
116
|
+
datetime.time: _convert_time_param,
|
|
117
|
+
**build_uuid_coercions(native=True),
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str, Any]":
|
|
122
|
+
"""Build connection configuration with non-null values only.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
connection_config: Raw connection configuration mapping.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
Dictionary with connection parameters.
|
|
129
|
+
"""
|
|
130
|
+
return {key: value for key, value in connection_config.items() if value is not None}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def build_profile() -> "DriverParameterProfile":
|
|
134
|
+
"""Create the AsyncPG driver parameter profile."""
|
|
135
|
+
|
|
136
|
+
return DriverParameterProfile(
|
|
137
|
+
name="AsyncPG",
|
|
138
|
+
default_style=ParameterStyle.NUMERIC,
|
|
139
|
+
supported_styles={ParameterStyle.NUMERIC, ParameterStyle.NAMED_COLON},
|
|
140
|
+
default_execution_style=ParameterStyle.NUMERIC,
|
|
141
|
+
supported_execution_styles={ParameterStyle.NUMERIC},
|
|
142
|
+
has_native_list_expansion=True,
|
|
143
|
+
preserve_parameter_format=True,
|
|
144
|
+
needs_static_script_compilation=False,
|
|
145
|
+
allow_mixed_parameter_styles=False,
|
|
146
|
+
preserve_original_params_for_many=False,
|
|
147
|
+
json_serializer_strategy="driver",
|
|
148
|
+
custom_type_coercions=_build_asyncpg_custom_type_coercions(),
|
|
149
|
+
default_dialect="postgres",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
driver_profile = build_profile()
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def configure_parameter_serializers(
|
|
157
|
+
parameter_config: "ParameterStyleConfig",
|
|
158
|
+
serializer: "Callable[[Any], str]",
|
|
159
|
+
*,
|
|
160
|
+
deserializer: "Callable[[str], Any] | None" = None,
|
|
161
|
+
) -> "ParameterStyleConfig":
|
|
162
|
+
"""Return a parameter configuration updated with AsyncPG JSON codecs."""
|
|
163
|
+
|
|
164
|
+
effective_deserializer = deserializer or parameter_config.json_deserializer or from_json
|
|
165
|
+
return parameter_config.replace(json_serializer=serializer, json_deserializer=effective_deserializer)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
async def invoke_prepared_statement(
|
|
169
|
+
prepared: Any, parameters: "tuple[Any, ...] | dict[str, Any] | list[Any] | None", *, fetch: bool
|
|
170
|
+
) -> Any:
|
|
171
|
+
"""Invoke an AsyncPG prepared statement with optional parameters.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
prepared: AsyncPG prepared statement object.
|
|
175
|
+
parameters: Prepared parameters payload.
|
|
176
|
+
fetch: Whether to fetch rows.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Query result or status message.
|
|
180
|
+
"""
|
|
181
|
+
if parameters is None:
|
|
182
|
+
if fetch:
|
|
183
|
+
return await prepared.fetch()
|
|
184
|
+
await prepared.fetch()
|
|
185
|
+
return prepared.get_statusmsg()
|
|
186
|
+
|
|
187
|
+
if isinstance(parameters, dict):
|
|
188
|
+
if fetch:
|
|
189
|
+
return await prepared.fetch(**parameters)
|
|
190
|
+
await prepared.fetch(**parameters)
|
|
191
|
+
return prepared.get_statusmsg()
|
|
192
|
+
|
|
193
|
+
if fetch:
|
|
194
|
+
return await prepared.fetch(*parameters)
|
|
195
|
+
await prepared.fetch(*parameters)
|
|
196
|
+
return prepared.get_statusmsg()
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def build_statement_config(
|
|
200
|
+
*, json_serializer: "Callable[[Any], str] | None" = None, json_deserializer: "Callable[[str], Any] | None" = None
|
|
201
|
+
) -> "StatementConfig":
|
|
202
|
+
"""Construct the AsyncPG statement configuration with optional JSON codecs."""
|
|
203
|
+
|
|
204
|
+
effective_serializer = json_serializer or to_json
|
|
205
|
+
effective_deserializer = json_deserializer or from_json
|
|
206
|
+
|
|
207
|
+
profile = driver_profile
|
|
208
|
+
base_config = build_statement_config_from_profile(
|
|
209
|
+
profile,
|
|
210
|
+
statement_overrides={"dialect": "postgres"},
|
|
211
|
+
json_serializer=effective_serializer,
|
|
212
|
+
json_deserializer=effective_deserializer,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
parameter_config = configure_parameter_serializers(
|
|
216
|
+
base_config.parameter_config, effective_serializer, deserializer=effective_deserializer
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
return base_config.replace(parameter_config=parameter_config)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
default_statement_config = build_statement_config()
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _encode_json_payload(value: Any, encoder: "Callable[[Any], str]") -> bytes:
|
|
226
|
+
if isinstance(value, bytes):
|
|
227
|
+
return value
|
|
228
|
+
if isinstance(value, bytearray):
|
|
229
|
+
return bytes(value)
|
|
230
|
+
if isinstance(value, memoryview):
|
|
231
|
+
return value.tobytes()
|
|
232
|
+
if isinstance(value, str):
|
|
233
|
+
return value.encode("utf-8")
|
|
234
|
+
|
|
235
|
+
encoded = encoder(value)
|
|
236
|
+
if isinstance(encoded, bytes):
|
|
237
|
+
return encoded
|
|
238
|
+
if isinstance(encoded, bytearray):
|
|
239
|
+
return bytes(encoded)
|
|
240
|
+
if isinstance(encoded, memoryview):
|
|
241
|
+
return encoded.tobytes()
|
|
242
|
+
return str(encoded).encode("utf-8")
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _decode_json_payload(value: Any, decoder: "Callable[[str], Any]") -> Any:
|
|
246
|
+
if isinstance(value, str):
|
|
247
|
+
return decoder(value)
|
|
248
|
+
if isinstance(value, memoryview):
|
|
249
|
+
value = value.tobytes()
|
|
250
|
+
return decoder(bytes(value).decode("utf-8"))
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def _encode_jsonb_payload(value: Any, encoder: "Callable[[Any], str]") -> bytes:
|
|
254
|
+
payload = _encode_json_payload(value, encoder)
|
|
255
|
+
if payload.startswith(_JSONB_BINARY_VERSION):
|
|
256
|
+
return payload
|
|
257
|
+
return _JSONB_BINARY_VERSION + payload
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def _decode_jsonb_payload(value: Any, decoder: "Callable[[str], Any]") -> Any:
|
|
261
|
+
if isinstance(value, str):
|
|
262
|
+
return decoder(value)
|
|
263
|
+
if isinstance(value, memoryview):
|
|
264
|
+
value = value.tobytes()
|
|
265
|
+
payload = bytes(value)
|
|
266
|
+
if payload.startswith(_JSONB_BINARY_VERSION):
|
|
267
|
+
payload = payload[1:]
|
|
268
|
+
return decoder(payload.decode("utf-8"))
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
async def register_json_codecs(connection: Any, encoder: Any, decoder: Any) -> None:
|
|
272
|
+
"""Register JSON type codecs on asyncpg connection."""
|
|
273
|
+
try:
|
|
274
|
+
await connection.set_type_codec(
|
|
275
|
+
"json",
|
|
276
|
+
encoder=lambda value: _encode_json_payload(value, encoder),
|
|
277
|
+
decoder=lambda value: _decode_json_payload(value, decoder),
|
|
278
|
+
schema="pg_catalog",
|
|
279
|
+
format="binary",
|
|
280
|
+
)
|
|
281
|
+
await connection.set_type_codec(
|
|
282
|
+
"jsonb",
|
|
283
|
+
encoder=lambda value: _encode_jsonb_payload(value, encoder),
|
|
284
|
+
decoder=lambda value: _decode_jsonb_payload(value, decoder),
|
|
285
|
+
schema="pg_catalog",
|
|
286
|
+
format="binary",
|
|
287
|
+
)
|
|
288
|
+
except Exception:
|
|
289
|
+
logger.exception("Failed to register JSON type codecs")
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
async def register_pgvector_support(connection: Any) -> None:
|
|
293
|
+
"""Register pgvector extension support on asyncpg connection."""
|
|
294
|
+
if not PGVECTOR_INSTALLED:
|
|
295
|
+
global _PGVECTOR_MISSING_LOGGED
|
|
296
|
+
if not _PGVECTOR_MISSING_LOGGED:
|
|
297
|
+
logger.debug("pgvector not installed - skipping vector type support")
|
|
298
|
+
_PGVECTOR_MISSING_LOGGED = True
|
|
299
|
+
return
|
|
300
|
+
|
|
301
|
+
try:
|
|
302
|
+
pgvector_asyncpg = importlib.import_module("pgvector.asyncpg")
|
|
303
|
+
await pgvector_asyncpg.register_vector(connection)
|
|
304
|
+
except Exception:
|
|
305
|
+
logger.exception("Failed to register pgvector support")
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def apply_driver_features(
|
|
309
|
+
statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
|
|
310
|
+
) -> "tuple[StatementConfig, dict[str, Any]]":
|
|
311
|
+
"""Apply AsyncPG driver feature defaults to statement config."""
|
|
312
|
+
processed_features: dict[str, Any] = dict(driver_features) if driver_features else {}
|
|
313
|
+
|
|
314
|
+
serializer = processed_features.setdefault("json_serializer", to_json)
|
|
315
|
+
deserializer = processed_features.setdefault("json_deserializer", from_json)
|
|
316
|
+
processed_features.setdefault("enable_json_codecs", True)
|
|
317
|
+
processed_features.setdefault("enable_pgvector", PGVECTOR_INSTALLED)
|
|
318
|
+
processed_features.setdefault("enable_paradedb", True)
|
|
319
|
+
processed_features.setdefault("enable_cloud_sql", False)
|
|
320
|
+
processed_features.setdefault("enable_alloydb", False)
|
|
321
|
+
|
|
322
|
+
parameter_config = configure_parameter_serializers(
|
|
323
|
+
statement_config.parameter_config, serializer, deserializer=deserializer
|
|
324
|
+
)
|
|
325
|
+
statement_config = statement_config.replace(parameter_config=parameter_config)
|
|
326
|
+
|
|
327
|
+
return statement_config, processed_features
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def parse_status(status: Any) -> int:
|
|
331
|
+
"""Parse AsyncPG status string to extract row count.
|
|
332
|
+
|
|
333
|
+
AsyncPG returns status strings like "INSERT 0 1", "UPDATE 3", "DELETE 2"
|
|
334
|
+
for non-SELECT operations. This method extracts the affected row count.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
status: Status string from AsyncPG operation.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
Number of affected rows, or 0 if cannot parse.
|
|
341
|
+
"""
|
|
342
|
+
if not status or not isinstance(status, str):
|
|
343
|
+
return 0
|
|
344
|
+
|
|
345
|
+
match = ASYNC_PG_STATUS_REGEX.match(status.strip())
|
|
346
|
+
if match:
|
|
347
|
+
groups = match.groups()
|
|
348
|
+
if len(groups) >= EXPECTED_REGEX_GROUPS:
|
|
349
|
+
try:
|
|
350
|
+
return int(groups[-1])
|
|
351
|
+
except (ValueError, IndexError):
|
|
352
|
+
pass
|
|
353
|
+
|
|
354
|
+
return 0
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def resolve_many_rowcount(parameter_sets: Any, *, fallback_count: "int | None" = None) -> int:
|
|
358
|
+
"""Resolve execute_many rowcount using the parameter payload size."""
|
|
359
|
+
if fallback_count is not None:
|
|
360
|
+
return fallback_count
|
|
361
|
+
if isinstance(parameter_sets, Sized):
|
|
362
|
+
return len(parameter_sets)
|
|
363
|
+
return 0
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def _create_postgres_error(
|
|
367
|
+
error: Any, code: "str | None", error_class: type[SQLSpecError], description: str
|
|
368
|
+
) -> SQLSpecError:
|
|
369
|
+
"""Create a SQLSpec exception from an asyncpg error.
|
|
370
|
+
|
|
371
|
+
Args:
|
|
372
|
+
error: The original asyncpg exception
|
|
373
|
+
code: PostgreSQL SQLSTATE error code
|
|
374
|
+
error_class: The SQLSpec exception class to instantiate
|
|
375
|
+
description: Human-readable description of the error type
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
A new SQLSpec exception instance with the original as its cause
|
|
379
|
+
"""
|
|
380
|
+
msg = f"PostgreSQL {description} [{code}]: {error}" if code else f"PostgreSQL {description}: {error}"
|
|
381
|
+
exc = error_class(msg)
|
|
382
|
+
exc.__cause__ = error
|
|
383
|
+
return exc
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
387
|
+
asyncpg.exceptions.UniqueViolationError, ("23505", UniqueViolationError, "unique constraint violation")
|
|
388
|
+
)
|
|
389
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
390
|
+
asyncpg.exceptions.ForeignKeyViolationError, ("23503", ForeignKeyViolationError, "foreign key constraint violation")
|
|
391
|
+
)
|
|
392
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
393
|
+
asyncpg.exceptions.NotNullViolationError, ("23502", NotNullViolationError, "not-null constraint violation")
|
|
394
|
+
)
|
|
395
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
396
|
+
asyncpg.exceptions.CheckViolationError, ("23514", CheckViolationError, "check constraint violation")
|
|
397
|
+
)
|
|
398
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
399
|
+
asyncpg.exceptions.IntegrityConstraintViolationError, ("23000", IntegrityError, "integrity constraint violation")
|
|
400
|
+
)
|
|
401
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
402
|
+
asyncpg.exceptions.DeadlockDetectedError, ("40P01", DeadlockError, "deadlock detected")
|
|
403
|
+
)
|
|
404
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
405
|
+
asyncpg.exceptions.SerializationError, ("40001", SerializationConflictError, "serialization failure")
|
|
406
|
+
)
|
|
407
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
408
|
+
asyncpg.exceptions.QueryCanceledError, ("57014", QueryTimeoutError, "query canceled")
|
|
409
|
+
)
|
|
410
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
411
|
+
asyncpg.exceptions.InsufficientPrivilegeError, ("42501", PermissionDeniedError, "insufficient privilege")
|
|
412
|
+
)
|
|
413
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
414
|
+
asyncpg.exceptions.InvalidPasswordError, ("28P01", PermissionDeniedError, "invalid password")
|
|
415
|
+
)
|
|
416
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
417
|
+
asyncpg.exceptions.InvalidAuthorizationSpecificationError, ("28000", PermissionDeniedError, "authorization error")
|
|
418
|
+
)
|
|
419
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
420
|
+
asyncpg.exceptions.ConnectionDoesNotExistError, ("08003", ConnectionTimeoutError, "connection does not exist")
|
|
421
|
+
)
|
|
422
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
423
|
+
asyncpg.exceptions.CannotConnectNowError, ("57P03", ConnectionTimeoutError, "cannot connect now")
|
|
424
|
+
)
|
|
425
|
+
_EXCEPTION_MAPPING_DISPATCHER.register(
|
|
426
|
+
asyncpg.exceptions.PostgresSyntaxError, ("42601", SQLParsingError, "SQL syntax error")
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def create_mapped_exception(error: Any) -> SQLSpecError:
|
|
431
|
+
"""Map asyncpg exceptions to SQLSpec exceptions.
|
|
432
|
+
|
|
433
|
+
This is a factory function that returns an exception instance rather than
|
|
434
|
+
raising. This pattern is more robust for use in __aexit__ handlers and
|
|
435
|
+
avoids issues with exception control flow in different Python versions.
|
|
436
|
+
|
|
437
|
+
Mapping priority:
|
|
438
|
+
1. Native asyncpg exception types (isinstance checks - most reliable)
|
|
439
|
+
2. SQLSTATE code via centralized utility
|
|
440
|
+
3. Generic SQLSpecError fallback
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
error: The asyncpg exception to map
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
A SQLSpec exception that wraps the original error
|
|
447
|
+
"""
|
|
448
|
+
mapped_error = _EXCEPTION_MAPPING_DISPATCHER.get(error)
|
|
449
|
+
if mapped_error is not None:
|
|
450
|
+
error_code, error_class, description = mapped_error
|
|
451
|
+
return _create_postgres_error(error, error_code, error_class, description)
|
|
452
|
+
|
|
453
|
+
# Priority 2: Fall back to SQLSTATE code mapping using centralized utility
|
|
454
|
+
sqlstate_attr = error.sqlstate if has_sqlstate(error) else None
|
|
455
|
+
sqlstate_code: str | None = sqlstate_attr if sqlstate_attr is not None else None
|
|
456
|
+
if sqlstate_code:
|
|
457
|
+
exc_class = map_sqlstate_to_exception(sqlstate_code)
|
|
458
|
+
if exc_class:
|
|
459
|
+
return _create_postgres_error(error, sqlstate_code, exc_class, "database error")
|
|
460
|
+
|
|
461
|
+
# Priority 3: Default fallback
|
|
462
|
+
return _create_postgres_error(error, sqlstate_code, SQLSpecError, "database error")
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
def collect_rows(records: "list[Any] | None") -> "tuple[list[Any], list[str]]":
|
|
466
|
+
"""Collect AsyncPG records and column names.
|
|
467
|
+
|
|
468
|
+
Returns raw asyncpg.Record objects without copying to dicts.
|
|
469
|
+
Lazy dict materialization is handled by SQLResult when needed.
|
|
470
|
+
|
|
471
|
+
Args:
|
|
472
|
+
records: Records returned from asyncpg fetch.
|
|
473
|
+
|
|
474
|
+
Returns:
|
|
475
|
+
Tuple of (rows, column_names).
|
|
476
|
+
"""
|
|
477
|
+
if not records:
|
|
478
|
+
return [], []
|
|
479
|
+
column_names = list(records[0].keys())
|
|
480
|
+
return records, column_names
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"""PostgreSQL-specific data dictionary for metadata queries via asyncpg."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from sqlspec.data_dictionary.dialects.postgres import resolve_postgres_json_type
|
|
6
|
+
from sqlspec.driver import AsyncDataDictionaryBase
|
|
7
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from sqlspec.adapters.asyncpg.driver import AsyncpgDriver
|
|
11
|
+
|
|
12
|
+
__all__ = ("AsyncpgDataDictionary",)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AsyncpgDataDictionary(AsyncDataDictionaryBase):
|
|
16
|
+
"""PostgreSQL-specific async data dictionary."""
|
|
17
|
+
|
|
18
|
+
dialect: ClassVar[str] = "postgres"
|
|
19
|
+
|
|
20
|
+
def __init__(self) -> None:
|
|
21
|
+
super().__init__()
|
|
22
|
+
|
|
23
|
+
def resolve_schema(self, schema: "str | None") -> "str | None":
|
|
24
|
+
"""Return a schema name using dialect defaults when missing."""
|
|
25
|
+
if schema is not None:
|
|
26
|
+
return schema
|
|
27
|
+
return self.get_dialect_config().default_schema
|
|
28
|
+
|
|
29
|
+
async def get_version(self, driver: "AsyncpgDriver") -> "VersionInfo | None":
|
|
30
|
+
"""Get PostgreSQL database version information.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
driver: Async database driver instance.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
PostgreSQL version information or None if detection fails.
|
|
37
|
+
|
|
38
|
+
"""
|
|
39
|
+
driver_id = id(driver)
|
|
40
|
+
# Inline cache check to avoid cross-module method call that causes mypyc segfault
|
|
41
|
+
if driver_id in self._version_fetch_attempted:
|
|
42
|
+
return self._version_cache.get(driver_id)
|
|
43
|
+
# Not cached, fetch from database
|
|
44
|
+
|
|
45
|
+
version_value = await driver.select_value_or_none(self.get_query("version"))
|
|
46
|
+
if not version_value:
|
|
47
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
48
|
+
self.cache_version(driver_id, None)
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
config = self.get_dialect_config()
|
|
52
|
+
version_info = self.parse_version_with_pattern(config.version_pattern, str(version_value))
|
|
53
|
+
if version_info is None:
|
|
54
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
55
|
+
self.cache_version(driver_id, None)
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
59
|
+
self.cache_version(id(driver), version_info)
|
|
60
|
+
return version_info
|
|
61
|
+
|
|
62
|
+
async def get_feature_flag(self, driver: "AsyncpgDriver", feature: str) -> bool:
|
|
63
|
+
"""Check if PostgreSQL database supports a specific feature.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
driver: Async database driver instance.
|
|
67
|
+
feature: Feature name to check.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
True if feature is supported, False otherwise.
|
|
71
|
+
|
|
72
|
+
"""
|
|
73
|
+
version_info = await self.get_version(driver)
|
|
74
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
75
|
+
|
|
76
|
+
async def get_optimal_type(self, driver: "AsyncpgDriver", type_category: str) -> str:
|
|
77
|
+
"""Get optimal PostgreSQL type for a category.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
driver: Async database driver instance.
|
|
81
|
+
type_category: Type category.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
PostgreSQL-specific type name.
|
|
85
|
+
|
|
86
|
+
"""
|
|
87
|
+
config = self.get_dialect_config()
|
|
88
|
+
version_info = await self.get_version(driver)
|
|
89
|
+
|
|
90
|
+
if type_category == "json":
|
|
91
|
+
return resolve_postgres_json_type(version_info)
|
|
92
|
+
|
|
93
|
+
return config.get_optimal_type(type_category)
|
|
94
|
+
|
|
95
|
+
def list_available_features(self) -> "list[str]":
|
|
96
|
+
"""List available feature flags for this dialect."""
|
|
97
|
+
config = self.get_dialect_config()
|
|
98
|
+
features = set(config.feature_flags.keys()) | set(config.feature_versions.keys())
|
|
99
|
+
return sorted(features)
|
|
100
|
+
|
|
101
|
+
async def get_tables(self, driver: "AsyncpgDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
102
|
+
"""Get tables sorted by topological dependency order using Recursive CTE."""
|
|
103
|
+
schema_name = self.resolve_schema(schema)
|
|
104
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
105
|
+
return await driver.select(
|
|
106
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
async def get_columns(
|
|
110
|
+
self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
111
|
+
) -> "list[ColumnMetadata]":
|
|
112
|
+
"""Get column information for a table or schema."""
|
|
113
|
+
schema_name = self.resolve_schema(schema)
|
|
114
|
+
if table is None:
|
|
115
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
116
|
+
return await driver.select(
|
|
117
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
121
|
+
return await driver.select(
|
|
122
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
async def get_indexes(
|
|
126
|
+
self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
127
|
+
) -> "list[IndexMetadata]":
|
|
128
|
+
"""Get index metadata for a table or schema."""
|
|
129
|
+
schema_name = self.resolve_schema(schema)
|
|
130
|
+
if table is None:
|
|
131
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
132
|
+
return await driver.select(
|
|
133
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
137
|
+
return await driver.select(
|
|
138
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
async def get_foreign_keys(
|
|
142
|
+
self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
143
|
+
) -> "list[ForeignKeyMetadata]":
|
|
144
|
+
"""Get foreign key metadata."""
|
|
145
|
+
schema_name = self.resolve_schema(schema)
|
|
146
|
+
if table is None:
|
|
147
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
148
|
+
return await driver.select(
|
|
149
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
150
|
+
)
|
|
151
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
152
|
+
return await driver.select(
|
|
153
|
+
self.get_query("foreign_keys_by_table"),
|
|
154
|
+
schema_name=schema_name,
|
|
155
|
+
table_name=table,
|
|
156
|
+
schema_type=ForeignKeyMetadata,
|
|
157
|
+
)
|