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,121 @@
|
|
|
1
|
+
"""PostgreSQL-specific data dictionary for metadata queries via psqlpy."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from mypy_extensions import mypyc_attr
|
|
6
|
+
|
|
7
|
+
from sqlspec.data_dictionary.dialects.postgres import resolve_postgres_json_type
|
|
8
|
+
from sqlspec.driver import AsyncDataDictionaryBase
|
|
9
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from sqlspec.adapters.psqlpy.driver import PsqlpyDriver
|
|
13
|
+
|
|
14
|
+
__all__ = ("PsqlpyDataDictionary",)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
18
|
+
class PsqlpyDataDictionary(AsyncDataDictionaryBase):
|
|
19
|
+
"""PostgreSQL-specific async data dictionary via psqlpy."""
|
|
20
|
+
|
|
21
|
+
dialect: ClassVar[str] = "postgres"
|
|
22
|
+
|
|
23
|
+
def __init__(self) -> None:
|
|
24
|
+
super().__init__()
|
|
25
|
+
|
|
26
|
+
async def get_version(self, driver: "PsqlpyDriver") -> "VersionInfo | None":
|
|
27
|
+
"""Get PostgreSQL database version information."""
|
|
28
|
+
driver_id = id(driver)
|
|
29
|
+
# Inline cache check to avoid cross-module method call that causes mypyc segfault
|
|
30
|
+
if driver_id in self._version_fetch_attempted:
|
|
31
|
+
return self._version_cache.get(driver_id)
|
|
32
|
+
# Not cached, fetch from database
|
|
33
|
+
|
|
34
|
+
version_value = await driver.select_value(self.get_query("version"))
|
|
35
|
+
if not version_value:
|
|
36
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
37
|
+
self.cache_version(driver_id, None)
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
|
|
41
|
+
if version_info is None:
|
|
42
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
43
|
+
self.cache_version(driver_id, None)
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
47
|
+
self.cache_version(driver_id, version_info)
|
|
48
|
+
return version_info
|
|
49
|
+
|
|
50
|
+
async def get_feature_flag(self, driver: "PsqlpyDriver", feature: str) -> bool:
|
|
51
|
+
"""Check if PostgreSQL database supports a specific feature."""
|
|
52
|
+
version_info = await self.get_version(driver)
|
|
53
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
54
|
+
|
|
55
|
+
async def get_optimal_type(self, driver: "PsqlpyDriver", type_category: str) -> str:
|
|
56
|
+
"""Get optimal PostgreSQL type for a category."""
|
|
57
|
+
config = self.get_dialect_config()
|
|
58
|
+
version_info = await self.get_version(driver)
|
|
59
|
+
|
|
60
|
+
if type_category == "json":
|
|
61
|
+
return resolve_postgres_json_type(version_info)
|
|
62
|
+
|
|
63
|
+
return config.get_optimal_type(type_category)
|
|
64
|
+
|
|
65
|
+
async def get_tables(self, driver: "PsqlpyDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
66
|
+
"""Get tables sorted by topological dependency order using Recursive CTE."""
|
|
67
|
+
schema_name = self.resolve_schema(schema)
|
|
68
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
69
|
+
return await driver.select(
|
|
70
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
async def get_columns(
|
|
74
|
+
self, driver: "PsqlpyDriver", table: "str | None" = None, schema: "str | None" = None
|
|
75
|
+
) -> "list[ColumnMetadata]":
|
|
76
|
+
"""Get column information for a table or schema."""
|
|
77
|
+
schema_name = self.resolve_schema(schema)
|
|
78
|
+
if table is None:
|
|
79
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
80
|
+
return await driver.select(
|
|
81
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
85
|
+
return await driver.select(
|
|
86
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
async def get_indexes(
|
|
90
|
+
self, driver: "PsqlpyDriver", table: "str | None" = None, schema: "str | None" = None
|
|
91
|
+
) -> "list[IndexMetadata]":
|
|
92
|
+
"""Get index metadata for a table or schema."""
|
|
93
|
+
schema_name = self.resolve_schema(schema)
|
|
94
|
+
if table is None:
|
|
95
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
96
|
+
return await driver.select(
|
|
97
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
101
|
+
return await driver.select(
|
|
102
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async def get_foreign_keys(
|
|
106
|
+
self, driver: "PsqlpyDriver", table: "str | None" = None, schema: "str | None" = None
|
|
107
|
+
) -> "list[ForeignKeyMetadata]":
|
|
108
|
+
"""Get foreign key metadata."""
|
|
109
|
+
schema_name = self.resolve_schema(schema)
|
|
110
|
+
if table is None:
|
|
111
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
112
|
+
return await driver.select(
|
|
113
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
114
|
+
)
|
|
115
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
116
|
+
return await driver.select(
|
|
117
|
+
self.get_query("foreign_keys_by_table"),
|
|
118
|
+
schema_name=schema_name,
|
|
119
|
+
table_name=table,
|
|
120
|
+
schema_type=ForeignKeyMetadata,
|
|
121
|
+
)
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
"""Psqlpy driver implementation for PostgreSQL connectivity.
|
|
2
|
+
|
|
3
|
+
Provides parameter style conversion, type coercion, error handling,
|
|
4
|
+
and transaction management.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import inspect
|
|
8
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
9
|
+
|
|
10
|
+
import psqlpy.exceptions
|
|
11
|
+
|
|
12
|
+
from sqlspec.adapters.psqlpy._typing import PsqlpyCursor, PsqlpySessionContext
|
|
13
|
+
from sqlspec.adapters.psqlpy.core import (
|
|
14
|
+
build_insert_statement,
|
|
15
|
+
coerce_numeric_for_write,
|
|
16
|
+
coerce_records_for_execute_many,
|
|
17
|
+
collect_rows,
|
|
18
|
+
create_mapped_exception,
|
|
19
|
+
default_statement_config,
|
|
20
|
+
driver_profile,
|
|
21
|
+
encode_records_for_binary_copy,
|
|
22
|
+
extract_rows_affected,
|
|
23
|
+
format_execute_many_parameters,
|
|
24
|
+
format_table_identifier,
|
|
25
|
+
get_parameter_casts,
|
|
26
|
+
normalize_scalar_parameter,
|
|
27
|
+
prepare_parameters_with_casts,
|
|
28
|
+
split_schema_and_table,
|
|
29
|
+
)
|
|
30
|
+
from sqlspec.adapters.psqlpy.data_dictionary import PsqlpyDataDictionary
|
|
31
|
+
from sqlspec.adapters.psqlpy.type_converter import PostgreSQLOutputConverter
|
|
32
|
+
from sqlspec.core import SQL, StatementConfig, get_cache_config, register_driver_profile
|
|
33
|
+
from sqlspec.driver import AsyncDriverAdapterBase, BaseAsyncExceptionHandler
|
|
34
|
+
from sqlspec.exceptions import SQLSpecError
|
|
35
|
+
from sqlspec.utils.logging import get_logger
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from collections.abc import Mapping, Sequence
|
|
39
|
+
|
|
40
|
+
from sqlspec.adapters.psqlpy._typing import PsqlpyConnection
|
|
41
|
+
from sqlspec.core import ArrowResult
|
|
42
|
+
from sqlspec.driver import ExecutionResult
|
|
43
|
+
from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
|
|
44
|
+
|
|
45
|
+
__all__ = ("PsqlpyCursor", "PsqlpyDriver", "PsqlpyExceptionHandler", "PsqlpySessionContext")
|
|
46
|
+
|
|
47
|
+
logger = get_logger("sqlspec.adapters.psqlpy")
|
|
48
|
+
|
|
49
|
+
_type_converter = PostgreSQLOutputConverter()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class PsqlpyExceptionHandler(BaseAsyncExceptionHandler):
|
|
53
|
+
"""Async context manager for handling psqlpy database exceptions.
|
|
54
|
+
|
|
55
|
+
Maps PostgreSQL SQLSTATE error codes to specific SQLSpec exceptions
|
|
56
|
+
for better error handling in application code.
|
|
57
|
+
|
|
58
|
+
Uses deferred exception pattern for mypyc compatibility: exceptions
|
|
59
|
+
are stored in pending_exception rather than raised from __aexit__
|
|
60
|
+
to avoid ABI boundary violations with compiled code.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
__slots__ = ()
|
|
64
|
+
|
|
65
|
+
def _handle_exception(self, exc_type: "type[BaseException] | None", exc_val: "BaseException") -> bool:
|
|
66
|
+
if exc_type is None:
|
|
67
|
+
return False
|
|
68
|
+
if issubclass(exc_type, (psqlpy.exceptions.DatabaseError, psqlpy.exceptions.Error)):
|
|
69
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
70
|
+
return True
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class PsqlpyDriver(AsyncDriverAdapterBase):
|
|
75
|
+
"""PostgreSQL driver implementation using psqlpy.
|
|
76
|
+
|
|
77
|
+
Provides parameter style conversion, type coercion, error handling,
|
|
78
|
+
and transaction management.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
__slots__ = ("_data_dictionary",)
|
|
82
|
+
dialect = "postgres"
|
|
83
|
+
|
|
84
|
+
def __init__(
|
|
85
|
+
self,
|
|
86
|
+
connection: "PsqlpyConnection",
|
|
87
|
+
statement_config: "StatementConfig | None" = None,
|
|
88
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
89
|
+
) -> None:
|
|
90
|
+
if statement_config is None:
|
|
91
|
+
statement_config = default_statement_config.replace(
|
|
92
|
+
enable_caching=get_cache_config().compiled_cache_enabled
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
96
|
+
self._data_dictionary: PsqlpyDataDictionary | None = None
|
|
97
|
+
|
|
98
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
99
|
+
# CORE DISPATCH METHODS
|
|
100
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
101
|
+
|
|
102
|
+
async def dispatch_execute(self, cursor: "PsqlpyConnection", statement: SQL) -> "ExecutionResult":
|
|
103
|
+
"""Execute single SQL statement.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
cursor: Psqlpy connection object
|
|
107
|
+
statement: SQL statement to execute
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
ExecutionResult with execution metadata
|
|
111
|
+
"""
|
|
112
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
113
|
+
|
|
114
|
+
driver_parameters = prepared_parameters
|
|
115
|
+
operation_type = statement.operation_type
|
|
116
|
+
should_coerce = operation_type != "SELECT"
|
|
117
|
+
effective_parameters = coerce_numeric_for_write(driver_parameters) if should_coerce else driver_parameters
|
|
118
|
+
params = cast("Sequence[Any] | Mapping[str, Any] | None", effective_parameters) or []
|
|
119
|
+
|
|
120
|
+
if statement.returns_rows():
|
|
121
|
+
query_result = await cursor.fetch(sql, params)
|
|
122
|
+
dict_rows, column_names = collect_rows(query_result)
|
|
123
|
+
|
|
124
|
+
return self.create_execution_result(
|
|
125
|
+
cursor,
|
|
126
|
+
selected_data=dict_rows,
|
|
127
|
+
column_names=column_names,
|
|
128
|
+
data_row_count=len(dict_rows),
|
|
129
|
+
is_select_result=True,
|
|
130
|
+
row_format="dict",
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
result = await cursor.execute(sql, params)
|
|
134
|
+
rows_affected = extract_rows_affected(result)
|
|
135
|
+
|
|
136
|
+
return self.create_execution_result(cursor, rowcount_override=rows_affected)
|
|
137
|
+
|
|
138
|
+
async def dispatch_execute_many(self, cursor: "PsqlpyConnection", statement: SQL) -> "ExecutionResult":
|
|
139
|
+
"""Execute SQL with multiple parameter sets.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
cursor: Psqlpy connection object
|
|
143
|
+
statement: SQL statement with multiple parameter sets
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
ExecutionResult with batch execution metadata
|
|
147
|
+
"""
|
|
148
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
149
|
+
|
|
150
|
+
if not prepared_parameters:
|
|
151
|
+
return self.create_execution_result(cursor, rowcount_override=0, is_many_result=True)
|
|
152
|
+
|
|
153
|
+
operation_type = statement.operation_type
|
|
154
|
+
should_coerce = operation_type != "SELECT"
|
|
155
|
+
formatted_parameters = format_execute_many_parameters(prepared_parameters, coerce_numeric=should_coerce)
|
|
156
|
+
|
|
157
|
+
await cursor.execute_many(sql, formatted_parameters)
|
|
158
|
+
|
|
159
|
+
rows_affected = len(formatted_parameters)
|
|
160
|
+
|
|
161
|
+
return self.create_execution_result(cursor, rowcount_override=rows_affected, is_many_result=True)
|
|
162
|
+
|
|
163
|
+
async def dispatch_execute_script(self, cursor: "PsqlpyConnection", statement: SQL) -> "ExecutionResult":
|
|
164
|
+
"""Execute SQL script with statement splitting.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
cursor: Psqlpy connection object
|
|
168
|
+
statement: SQL statement with script content
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
ExecutionResult with script execution metadata
|
|
172
|
+
|
|
173
|
+
Notes:
|
|
174
|
+
Uses execute() with empty parameters for each statement instead of execute_batch().
|
|
175
|
+
execute_batch() uses simple query protocol which can break subsequent queries
|
|
176
|
+
that rely on extended protocol (e.g., information_schema queries with name type).
|
|
177
|
+
"""
|
|
178
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
179
|
+
prepared_parameters = cast("Sequence[Any] | Mapping[str, Any] | None", prepared_parameters)
|
|
180
|
+
statement_config = statement.statement_config
|
|
181
|
+
statements = self.split_script_statements(sql, statement_config, strip_trailing_semicolon=True)
|
|
182
|
+
|
|
183
|
+
successful_count = 0
|
|
184
|
+
last_result = None
|
|
185
|
+
|
|
186
|
+
for stmt in statements:
|
|
187
|
+
last_result = await cursor.execute(stmt, prepared_parameters or [])
|
|
188
|
+
successful_count += 1
|
|
189
|
+
|
|
190
|
+
return self.create_execution_result(
|
|
191
|
+
last_result, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
195
|
+
# TRANSACTION MANAGEMENT
|
|
196
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
async def begin(self) -> None:
|
|
199
|
+
"""Begin a database transaction."""
|
|
200
|
+
try:
|
|
201
|
+
await self.connection.execute("BEGIN")
|
|
202
|
+
except psqlpy.exceptions.DatabaseError as e:
|
|
203
|
+
msg = f"Failed to begin psqlpy transaction: {e}"
|
|
204
|
+
raise SQLSpecError(msg) from e
|
|
205
|
+
|
|
206
|
+
async def commit(self) -> None:
|
|
207
|
+
"""Commit the current transaction."""
|
|
208
|
+
try:
|
|
209
|
+
await self.connection.execute("COMMIT")
|
|
210
|
+
except psqlpy.exceptions.DatabaseError as e:
|
|
211
|
+
msg = f"Failed to commit psqlpy transaction: {e}"
|
|
212
|
+
raise SQLSpecError(msg) from e
|
|
213
|
+
|
|
214
|
+
async def rollback(self) -> None:
|
|
215
|
+
"""Rollback the current transaction."""
|
|
216
|
+
try:
|
|
217
|
+
await self.connection.execute("ROLLBACK")
|
|
218
|
+
except psqlpy.exceptions.DatabaseError as e:
|
|
219
|
+
msg = f"Failed to rollback psqlpy transaction: {e}"
|
|
220
|
+
raise SQLSpecError(msg) from e
|
|
221
|
+
|
|
222
|
+
def with_cursor(self, connection: "PsqlpyConnection") -> "PsqlpyCursor":
|
|
223
|
+
"""Create context manager for psqlpy cursor.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
connection: Psqlpy connection object
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
PsqlpyCursor context manager
|
|
230
|
+
"""
|
|
231
|
+
return PsqlpyCursor(connection)
|
|
232
|
+
|
|
233
|
+
def handle_database_exceptions(self) -> "PsqlpyExceptionHandler":
|
|
234
|
+
"""Handle database-specific exceptions.
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
Exception handler context manager
|
|
238
|
+
"""
|
|
239
|
+
return PsqlpyExceptionHandler()
|
|
240
|
+
|
|
241
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
242
|
+
# STORAGE API METHODS
|
|
243
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
244
|
+
|
|
245
|
+
async def select_to_storage(
|
|
246
|
+
self,
|
|
247
|
+
statement: "SQL | str",
|
|
248
|
+
destination: "StorageDestination",
|
|
249
|
+
/,
|
|
250
|
+
*parameters: Any,
|
|
251
|
+
statement_config: "StatementConfig | None" = None,
|
|
252
|
+
partitioner: "dict[str, object] | None" = None,
|
|
253
|
+
format_hint: "StorageFormat | None" = None,
|
|
254
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
255
|
+
**kwargs: Any,
|
|
256
|
+
) -> "StorageBridgeJob":
|
|
257
|
+
"""Execute a query and stream Arrow results to a storage backend."""
|
|
258
|
+
|
|
259
|
+
self._require_capability("arrow_export_enabled")
|
|
260
|
+
arrow_result = await self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
|
|
261
|
+
async_pipeline = self._storage_pipeline()
|
|
262
|
+
telemetry_payload = await self._write_result_to_storage_async(
|
|
263
|
+
arrow_result, destination, format_hint=format_hint, pipeline=async_pipeline
|
|
264
|
+
)
|
|
265
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
266
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
267
|
+
|
|
268
|
+
async def load_from_arrow(
|
|
269
|
+
self,
|
|
270
|
+
table: str,
|
|
271
|
+
source: "ArrowResult | Any",
|
|
272
|
+
*,
|
|
273
|
+
partitioner: "dict[str, object] | None" = None,
|
|
274
|
+
overwrite: bool = False,
|
|
275
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
276
|
+
) -> "StorageBridgeJob":
|
|
277
|
+
"""Load Arrow-formatted data into PostgreSQL via psqlpy binary COPY."""
|
|
278
|
+
|
|
279
|
+
self._require_capability("arrow_import_enabled")
|
|
280
|
+
arrow_table = self._coerce_arrow_table(source)
|
|
281
|
+
if overwrite:
|
|
282
|
+
qualified = format_table_identifier(table)
|
|
283
|
+
exc_handler = self.handle_database_exceptions()
|
|
284
|
+
async with exc_handler, self.with_cursor(self.connection) as cursor:
|
|
285
|
+
await cursor.execute(f"TRUNCATE TABLE {qualified}")
|
|
286
|
+
if exc_handler.pending_exception is not None:
|
|
287
|
+
raise exc_handler.pending_exception from None
|
|
288
|
+
|
|
289
|
+
columns, records = self._arrow_table_to_rows(arrow_table)
|
|
290
|
+
if records:
|
|
291
|
+
schema_name, table_name = split_schema_and_table(table)
|
|
292
|
+
exc_handler = self.handle_database_exceptions()
|
|
293
|
+
async with exc_handler, self.with_cursor(self.connection) as cursor:
|
|
294
|
+
copy_kwargs: dict[str, Any] = {"columns": columns}
|
|
295
|
+
if schema_name:
|
|
296
|
+
copy_kwargs["schema_name"] = schema_name
|
|
297
|
+
try:
|
|
298
|
+
copy_payload = encode_records_for_binary_copy(records)
|
|
299
|
+
copy_operation = cursor.binary_copy_to_table(copy_payload, table_name, **copy_kwargs)
|
|
300
|
+
if inspect.isawaitable(copy_operation):
|
|
301
|
+
await copy_operation
|
|
302
|
+
except (TypeError, psqlpy.exceptions.DatabaseError) as exc:
|
|
303
|
+
logger.debug("Binary COPY not available for psqlpy; falling back to INSERT statements: %s", exc)
|
|
304
|
+
insert_sql = build_insert_statement(table, columns)
|
|
305
|
+
formatted_records = coerce_records_for_execute_many(records)
|
|
306
|
+
try:
|
|
307
|
+
insert_operation = cursor.execute_many(insert_sql, formatted_records)
|
|
308
|
+
if inspect.isawaitable(insert_operation):
|
|
309
|
+
await insert_operation
|
|
310
|
+
except (psqlpy.exceptions.DatabaseError, psqlpy.exceptions.Error) as fallback_exc:
|
|
311
|
+
if "PyJSON must be dict, list, or tuple" not in str(fallback_exc):
|
|
312
|
+
raise
|
|
313
|
+
formatted_records = coerce_records_for_execute_many(records, parse_json_text=True)
|
|
314
|
+
insert_operation = cursor.execute_many(insert_sql, formatted_records)
|
|
315
|
+
if inspect.isawaitable(insert_operation):
|
|
316
|
+
await insert_operation
|
|
317
|
+
if exc_handler.pending_exception is not None:
|
|
318
|
+
raise exc_handler.pending_exception from None
|
|
319
|
+
|
|
320
|
+
telemetry_payload = self._build_ingest_telemetry(arrow_table)
|
|
321
|
+
telemetry_payload["destination"] = table
|
|
322
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
323
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
324
|
+
|
|
325
|
+
async def load_from_storage(
|
|
326
|
+
self,
|
|
327
|
+
table: str,
|
|
328
|
+
source: "StorageDestination",
|
|
329
|
+
*,
|
|
330
|
+
file_format: "StorageFormat",
|
|
331
|
+
partitioner: "dict[str, object] | None" = None,
|
|
332
|
+
overwrite: bool = False,
|
|
333
|
+
) -> "StorageBridgeJob":
|
|
334
|
+
"""Load staged artifacts from storage using the storage bridge pipeline."""
|
|
335
|
+
|
|
336
|
+
arrow_table, inbound = await self._read_arrow_from_storage_async(source, file_format=file_format)
|
|
337
|
+
return await self.load_from_arrow(
|
|
338
|
+
table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
342
|
+
# UTILITY METHODS
|
|
343
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
344
|
+
|
|
345
|
+
def prepare_driver_parameters(
|
|
346
|
+
self,
|
|
347
|
+
parameters: Any,
|
|
348
|
+
statement_config: "StatementConfig",
|
|
349
|
+
is_many: bool = False,
|
|
350
|
+
prepared_statement: Any | None = None,
|
|
351
|
+
) -> Any:
|
|
352
|
+
"""Prepare parameters with cast-aware type coercion for psqlpy.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
parameters: Parameters in any format
|
|
356
|
+
statement_config: Statement configuration
|
|
357
|
+
is_many: Whether this is for execute_many operation
|
|
358
|
+
prepared_statement: Prepared statement containing the original SQL statement
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
Parameters with cast-aware type coercion applied
|
|
362
|
+
"""
|
|
363
|
+
enable_cast_detection = self.driver_features.get("enable_cast_detection", True)
|
|
364
|
+
|
|
365
|
+
if enable_cast_detection and prepared_statement and self.dialect in {"postgres", "postgresql"} and not is_many:
|
|
366
|
+
parameter_casts = get_parameter_casts(prepared_statement)
|
|
367
|
+
prepared = prepare_parameters_with_casts(parameters, parameter_casts, statement_config)
|
|
368
|
+
else:
|
|
369
|
+
prepared = super().prepare_driver_parameters(parameters, statement_config, is_many, prepared_statement)
|
|
370
|
+
|
|
371
|
+
if not is_many and isinstance(prepared, list):
|
|
372
|
+
prepared = tuple(prepared)
|
|
373
|
+
|
|
374
|
+
if not is_many and isinstance(prepared, tuple):
|
|
375
|
+
return tuple(normalize_scalar_parameter(item) for item in prepared)
|
|
376
|
+
|
|
377
|
+
return prepared
|
|
378
|
+
|
|
379
|
+
@property
|
|
380
|
+
def data_dictionary(self) -> "PsqlpyDataDictionary":
|
|
381
|
+
"""Get the data dictionary for this driver.
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
Data dictionary instance for metadata queries
|
|
385
|
+
"""
|
|
386
|
+
if self._data_dictionary is None:
|
|
387
|
+
self._data_dictionary = PsqlpyDataDictionary()
|
|
388
|
+
return self._data_dictionary
|
|
389
|
+
|
|
390
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
391
|
+
# PRIVATE/INTERNAL METHODS
|
|
392
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
393
|
+
|
|
394
|
+
def collect_rows(self, cursor: "PsqlpyConnection", fetched: "list[Any]") -> "tuple[list[Any], list[str], int]":
|
|
395
|
+
"""Collect psqlpy rows for the direct execution path.
|
|
396
|
+
|
|
397
|
+
The ``fetched`` argument may be a psqlpy query result or a plain list.
|
|
398
|
+
"""
|
|
399
|
+
dict_rows, column_names = collect_rows(fetched)
|
|
400
|
+
return dict_rows, column_names, len(dict_rows)
|
|
401
|
+
|
|
402
|
+
def resolve_rowcount(self, cursor: "PsqlpyConnection") -> int:
|
|
403
|
+
"""Resolve rowcount from psqlpy result for the direct execution path."""
|
|
404
|
+
return extract_rows_affected(cursor)
|
|
405
|
+
|
|
406
|
+
def _connection_in_transaction(self) -> bool:
|
|
407
|
+
"""Check if connection is in transaction."""
|
|
408
|
+
return bool(self.connection.in_transaction())
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
register_driver_profile("psqlpy", driver_profile)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""Events helpers for the psqlpy adapter."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.adapters.psqlpy.events.backend import PsqlpyEventsBackend, PsqlpyHybridEventsBackend, create_event_backend
|
|
4
|
+
from sqlspec.adapters.psqlpy.events.store import PsqlpyEventQueueStore
|
|
5
|
+
|
|
6
|
+
__all__ = ("PsqlpyEventQueueStore", "PsqlpyEventsBackend", "PsqlpyHybridEventsBackend", "create_event_backend")
|