sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/__init__.py +140 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_serialization.py +315 -0
- sqlspec/_typing.py +700 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +5 -0
- sqlspec/adapters/adbc/_typing.py +82 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1273 -0
- sqlspec/adapters/adbc/config.py +295 -0
- sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/core.py +735 -0
- sqlspec/adapters/adbc/data_dictionary.py +334 -0
- sqlspec/adapters/adbc/driver.py +529 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +502 -0
- sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/type_converter.py +140 -0
- sqlspec/adapters/aiosqlite/__init__.py +25 -0
- sqlspec/adapters/aiosqlite/_typing.py +82 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +818 -0
- sqlspec/adapters/aiosqlite/config.py +334 -0
- sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
- sqlspec/adapters/aiosqlite/driver.py +313 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.py +533 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +87 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +703 -0
- sqlspec/adapters/asyncmy/config.py +302 -0
- sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncmy/core.py +360 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
- sqlspec/adapters/asyncmy/driver.py +383 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +19 -0
- sqlspec/adapters/asyncpg/_typing.py +88 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +748 -0
- sqlspec/adapters/asyncpg/config.py +569 -0
- sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncpg/core.py +367 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/backend.py +286 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +14 -0
- sqlspec/adapters/bigquery/_typing.py +86 -0
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +827 -0
- sqlspec/adapters/bigquery/config.py +353 -0
- sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/core.py +715 -0
- sqlspec/adapters/bigquery/data_dictionary.py +128 -0
- sqlspec/adapters/bigquery/driver.py +548 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
- sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
- sqlspec/adapters/cockroach_psycopg/config.py +484 -0
- sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
- sqlspec/adapters/duckdb/__init__.py +25 -0
- sqlspec/adapters/duckdb/_typing.py +81 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +850 -0
- sqlspec/adapters/duckdb/config.py +463 -0
- sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/core.py +257 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +430 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.py +293 -0
- sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mock/__init__.py +72 -0
- sqlspec/adapters/mock/_typing.py +147 -0
- sqlspec/adapters/mock/config.py +483 -0
- sqlspec/adapters/mock/core.py +319 -0
- sqlspec/adapters/mock/data_dictionary.py +366 -0
- sqlspec/adapters/mock/driver.py +721 -0
- sqlspec/adapters/mysqlconnector/__init__.py +36 -0
- sqlspec/adapters/mysqlconnector/_typing.py +141 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
- sqlspec/adapters/mysqlconnector/config.py +394 -0
- sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/mysqlconnector/core.py +303 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
- sqlspec/adapters/mysqlconnector/driver.py +483 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +60 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
- sqlspec/adapters/oracledb/_typing.py +182 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
- sqlspec/adapters/oracledb/adk/__init__.py +10 -0
- sqlspec/adapters/oracledb/adk/store.py +2369 -0
- sqlspec/adapters/oracledb/config.py +550 -0
- sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/core.py +543 -0
- sqlspec/adapters/oracledb/data_dictionary.py +536 -0
- sqlspec/adapters/oracledb/driver.py +1229 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/backend.py +347 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +535 -0
- sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +17 -0
- sqlspec/adapters/psqlpy/_typing.py +79 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +766 -0
- sqlspec/adapters/psqlpy/config.py +304 -0
- sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/core.py +480 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
- sqlspec/adapters/psqlpy/driver.py +438 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/backend.py +310 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +32 -0
- sqlspec/adapters/psycopg/_typing.py +164 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1387 -0
- sqlspec/adapters/psycopg/config.py +576 -0
- sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/core.py +450 -0
- sqlspec/adapters/psycopg/data_dictionary.py +289 -0
- sqlspec/adapters/psycopg/driver.py +975 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/backend.py +458 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +552 -0
- sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +71 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +540 -0
- sqlspec/adapters/pymysql/config.py +195 -0
- sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/pymysql/core.py +299 -0
- sqlspec/adapters/pymysql/data_dictionary.py +122 -0
- sqlspec/adapters/pymysql/driver.py +259 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.py +137 -0
- sqlspec/adapters/spanner/__init__.py +40 -0
- sqlspec/adapters/spanner/_typing.py +86 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +732 -0
- sqlspec/adapters/spanner/config.py +352 -0
- sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/core.py +188 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/dialect/__init__.py +6 -0
- sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
- sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
- sqlspec/adapters/spanner/driver.py +373 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/type_converter.py +331 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +80 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +958 -0
- sqlspec/adapters/sqlite/config.py +280 -0
- sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/core.py +312 -0
- sqlspec/adapters/sqlite/data_dictionary.py +202 -0
- sqlspec/adapters/sqlite/driver.py +359 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.py +198 -0
- sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +747 -0
- sqlspec/builder/__init__.py +179 -0
- sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_base.py +1022 -0
- sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_ddl.py +1642 -0
- sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_dml.py +365 -0
- sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_factory.py +1697 -0
- sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_insert.py +328 -0
- sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_join.py +499 -0
- sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_merge.py +821 -0
- sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_parsing_utils.py +297 -0
- sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_select.py +1660 -0
- sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_temporal.py +139 -0
- sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_expressions.py +267 -0
- sqlspec/cli.py +911 -0
- sqlspec/config.py +1755 -0
- sqlspec/core/__init__.py +374 -0
- sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/cache.py +1069 -0
- sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/compiler.py +954 -0
- sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/filters.py +952 -0
- sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/hashing.py +262 -0
- sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +71 -0
- sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_alignment.py +270 -0
- sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_converter.py +543 -0
- sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_processor.py +505 -0
- sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_transformers.py +292 -0
- sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_types.py +499 -0
- sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_validator.py +180 -0
- sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/pipeline.py +319 -0
- sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/query_modifiers.py +437 -0
- sqlspec/core/result/__init__.py +23 -0
- sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_base.py +1121 -0
- sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/splitter.py +966 -0
- sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/statement.py +1503 -0
- sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/type_converter.py +339 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.py +123 -0
- sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +49 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
- sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +42 -0
- sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +34 -0
- sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +46 -0
- sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +42 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/driver/__init__.py +32 -0
- sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_async.py +1737 -0
- sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_common.py +1478 -0
- sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sql_helpers.py +148 -0
- sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_storage_helpers.py +144 -0
- sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sync.py +1710 -0
- sqlspec/exceptions.py +338 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +70 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +149 -0
- sqlspec/extensions/adk/memory/service.py +217 -0
- sqlspec/extensions/adk/memory/store.py +569 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +225 -0
- sqlspec/extensions/adk/store.py +567 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +461 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +19 -0
- sqlspec/extensions/fastapi/extension.py +351 -0
- sqlspec/extensions/fastapi/providers.py +607 -0
- sqlspec/extensions/flask/__init__.py +37 -0
- sqlspec/extensions/flask/_state.py +76 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +519 -0
- sqlspec/extensions/litestar/__init__.py +28 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +671 -0
- sqlspec/extensions/litestar/providers.py +526 -0
- sqlspec/extensions/litestar/store.py +296 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/starlette/__init__.py +19 -0
- sqlspec/extensions/starlette/_state.py +30 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +346 -0
- sqlspec/extensions/starlette/middleware.py +235 -0
- sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/loader.py +702 -0
- sqlspec/migrations/__init__.py +36 -0
- sqlspec/migrations/base.py +731 -0
- sqlspec/migrations/commands.py +1232 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.py +1172 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.py +611 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.py +207 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +55 -0
- sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_config.py +348 -0
- sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_dispatcher.py +152 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_observer.py +357 -0
- sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_runtime.py +420 -0
- sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +916 -0
- sqlspec/py.typed +0 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_utils.py +104 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.py +253 -0
- sqlspec/storage/backends/fsspec.py +529 -0
- sqlspec/storage/backends/local.py +441 -0
- sqlspec/storage/backends/obstore.py +916 -0
- sqlspec/storage/errors.py +104 -0
- sqlspec/storage/pipeline.py +582 -0
- sqlspec/storage/registry.py +301 -0
- sqlspec/typing.py +395 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +318 -0
- sqlspec/utils/config_tools.py +332 -0
- sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.py +190 -0
- sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/fixtures.py +258 -0
- sqlspec/utils/logging.py +222 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/portal.py +375 -0
- sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/schema.py +485 -0
- sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/serializers.py +408 -0
- sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/sync_tools.py +311 -0
- sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/text.py +108 -0
- sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_converters.py +128 -0
- sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_guards.py +1360 -0
- sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/uuids.py +225 -0
- sqlspec-0.36.0.dist-info/METADATA +205 -0
- sqlspec-0.36.0.dist-info/RECORD +531 -0
- sqlspec-0.36.0.dist-info/WHEEL +7 -0
- sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
- sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
"""AsyncPG adapter compiled helpers."""
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
import importlib
|
|
5
|
+
import re
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Final, NamedTuple
|
|
7
|
+
|
|
8
|
+
import asyncpg
|
|
9
|
+
|
|
10
|
+
from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
|
|
11
|
+
from sqlspec.exceptions import (
|
|
12
|
+
CheckViolationError,
|
|
13
|
+
DatabaseConnectionError,
|
|
14
|
+
DataError,
|
|
15
|
+
ForeignKeyViolationError,
|
|
16
|
+
IntegrityError,
|
|
17
|
+
NotNullViolationError,
|
|
18
|
+
OperationalError,
|
|
19
|
+
SQLParsingError,
|
|
20
|
+
SQLSpecError,
|
|
21
|
+
TransactionError,
|
|
22
|
+
UniqueViolationError,
|
|
23
|
+
)
|
|
24
|
+
from sqlspec.typing import PGVECTOR_INSTALLED
|
|
25
|
+
from sqlspec.utils.logging import get_logger
|
|
26
|
+
from sqlspec.utils.serializers import from_json, to_json
|
|
27
|
+
from sqlspec.utils.type_guards import has_sqlstate
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from collections.abc import Callable, Mapping
|
|
31
|
+
|
|
32
|
+
from sqlspec.core import SQL, ParameterStyleConfig, StackOperation
|
|
33
|
+
|
|
34
|
+
__all__ = (
|
|
35
|
+
"NormalizedStackOperation",
|
|
36
|
+
"apply_driver_features",
|
|
37
|
+
"build_connection_config",
|
|
38
|
+
"build_profile",
|
|
39
|
+
"build_statement_config",
|
|
40
|
+
"collect_rows",
|
|
41
|
+
"configure_parameter_serializers",
|
|
42
|
+
"create_mapped_exception",
|
|
43
|
+
"default_statement_config",
|
|
44
|
+
"driver_profile",
|
|
45
|
+
"invoke_prepared_statement",
|
|
46
|
+
"parse_status",
|
|
47
|
+
"register_json_codecs",
|
|
48
|
+
"register_pgvector_support",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
ASYNC_PG_STATUS_REGEX: "re.Pattern[str]" = re.compile(r"^([A-Z]+)(?:\s+(\d+))?\s+(\d+)$", re.IGNORECASE)
|
|
52
|
+
EXPECTED_REGEX_GROUPS = 3
|
|
53
|
+
|
|
54
|
+
logger = get_logger("sqlspec.adapters.asyncpg.core")
|
|
55
|
+
_PGVECTOR_MISSING_LOGGED = False
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class NormalizedStackOperation(NamedTuple):
|
|
59
|
+
"""Normalized execution metadata used for prepared stack operations."""
|
|
60
|
+
|
|
61
|
+
operation: "StackOperation"
|
|
62
|
+
statement: "SQL"
|
|
63
|
+
sql: str
|
|
64
|
+
parameters: "tuple[Any, ...] | dict[str, Any] | None"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
PREPARED_STATEMENT_CACHE_SIZE: Final[int] = 32
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _convert_datetime_param(value: Any) -> Any:
|
|
71
|
+
"""Convert datetime parameter, handling ISO strings."""
|
|
72
|
+
|
|
73
|
+
if isinstance(value, str):
|
|
74
|
+
return datetime.datetime.fromisoformat(value)
|
|
75
|
+
return value
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _convert_date_param(value: Any) -> Any:
|
|
79
|
+
"""Convert date parameter, handling ISO strings."""
|
|
80
|
+
|
|
81
|
+
if isinstance(value, str):
|
|
82
|
+
return datetime.date.fromisoformat(value)
|
|
83
|
+
return value
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _convert_time_param(value: Any) -> Any:
|
|
87
|
+
"""Convert time parameter, handling ISO strings."""
|
|
88
|
+
|
|
89
|
+
if isinstance(value, str):
|
|
90
|
+
return datetime.time.fromisoformat(value)
|
|
91
|
+
return value
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _build_asyncpg_custom_type_coercions() -> "dict[type, Callable[[Any], Any]]":
|
|
95
|
+
"""Return custom type coercions for AsyncPG."""
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
datetime.datetime: _convert_datetime_param,
|
|
99
|
+
datetime.date: _convert_date_param,
|
|
100
|
+
datetime.time: _convert_time_param,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str, Any]":
|
|
105
|
+
"""Build connection configuration with non-null values only.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
connection_config: Raw connection configuration mapping.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Dictionary with connection parameters.
|
|
112
|
+
"""
|
|
113
|
+
return {key: value for key, value in connection_config.items() if value is not None}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def build_profile() -> "DriverParameterProfile":
|
|
117
|
+
"""Create the AsyncPG driver parameter profile."""
|
|
118
|
+
|
|
119
|
+
return DriverParameterProfile(
|
|
120
|
+
name="AsyncPG",
|
|
121
|
+
default_style=ParameterStyle.NUMERIC,
|
|
122
|
+
supported_styles={ParameterStyle.NUMERIC, ParameterStyle.POSITIONAL_PYFORMAT},
|
|
123
|
+
default_execution_style=ParameterStyle.NUMERIC,
|
|
124
|
+
supported_execution_styles={ParameterStyle.NUMERIC},
|
|
125
|
+
has_native_list_expansion=True,
|
|
126
|
+
preserve_parameter_format=True,
|
|
127
|
+
needs_static_script_compilation=False,
|
|
128
|
+
allow_mixed_parameter_styles=False,
|
|
129
|
+
preserve_original_params_for_many=False,
|
|
130
|
+
json_serializer_strategy="driver",
|
|
131
|
+
custom_type_coercions=_build_asyncpg_custom_type_coercions(),
|
|
132
|
+
default_dialect="postgres",
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
driver_profile = build_profile()
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def configure_parameter_serializers(
|
|
140
|
+
parameter_config: "ParameterStyleConfig",
|
|
141
|
+
serializer: "Callable[[Any], str]",
|
|
142
|
+
*,
|
|
143
|
+
deserializer: "Callable[[str], Any] | None" = None,
|
|
144
|
+
) -> "ParameterStyleConfig":
|
|
145
|
+
"""Return a parameter configuration updated with AsyncPG JSON codecs."""
|
|
146
|
+
|
|
147
|
+
effective_deserializer = deserializer or parameter_config.json_deserializer or from_json
|
|
148
|
+
return parameter_config.replace(json_serializer=serializer, json_deserializer=effective_deserializer)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
async def invoke_prepared_statement(
|
|
152
|
+
prepared: Any, parameters: "tuple[Any, ...] | dict[str, Any] | list[Any] | None", *, fetch: bool
|
|
153
|
+
) -> Any:
|
|
154
|
+
"""Invoke an AsyncPG prepared statement with optional parameters.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
prepared: AsyncPG prepared statement object.
|
|
158
|
+
parameters: Prepared parameters payload.
|
|
159
|
+
fetch: Whether to fetch rows.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
Query result or status message.
|
|
163
|
+
"""
|
|
164
|
+
if parameters is None:
|
|
165
|
+
if fetch:
|
|
166
|
+
return await prepared.fetch()
|
|
167
|
+
await prepared.fetch()
|
|
168
|
+
return prepared.get_statusmsg()
|
|
169
|
+
|
|
170
|
+
if isinstance(parameters, dict):
|
|
171
|
+
if fetch:
|
|
172
|
+
return await prepared.fetch(**parameters)
|
|
173
|
+
await prepared.fetch(**parameters)
|
|
174
|
+
return prepared.get_statusmsg()
|
|
175
|
+
|
|
176
|
+
if fetch:
|
|
177
|
+
return await prepared.fetch(*parameters)
|
|
178
|
+
await prepared.fetch(*parameters)
|
|
179
|
+
return prepared.get_statusmsg()
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def build_statement_config(
|
|
183
|
+
*, json_serializer: "Callable[[Any], str] | None" = None, json_deserializer: "Callable[[str], Any] | None" = None
|
|
184
|
+
) -> "StatementConfig":
|
|
185
|
+
"""Construct the AsyncPG statement configuration with optional JSON codecs."""
|
|
186
|
+
|
|
187
|
+
effective_serializer = json_serializer or to_json
|
|
188
|
+
effective_deserializer = json_deserializer or from_json
|
|
189
|
+
|
|
190
|
+
profile = driver_profile
|
|
191
|
+
base_config = build_statement_config_from_profile(
|
|
192
|
+
profile,
|
|
193
|
+
statement_overrides={"dialect": "postgres"},
|
|
194
|
+
json_serializer=effective_serializer,
|
|
195
|
+
json_deserializer=effective_deserializer,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
parameter_config = configure_parameter_serializers(
|
|
199
|
+
base_config.parameter_config, effective_serializer, deserializer=effective_deserializer
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return base_config.replace(parameter_config=parameter_config)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
default_statement_config = build_statement_config()
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
async def register_json_codecs(connection: Any, encoder: Any, decoder: Any) -> None:
|
|
209
|
+
"""Register JSON type codecs on asyncpg connection."""
|
|
210
|
+
try:
|
|
211
|
+
await connection.set_type_codec("json", encoder=encoder, decoder=decoder, schema="pg_catalog")
|
|
212
|
+
await connection.set_type_codec("jsonb", encoder=encoder, decoder=decoder, schema="pg_catalog")
|
|
213
|
+
except Exception:
|
|
214
|
+
logger.exception("Failed to register JSON type codecs")
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
async def register_pgvector_support(connection: Any) -> None:
|
|
218
|
+
"""Register pgvector extension support on asyncpg connection."""
|
|
219
|
+
if not PGVECTOR_INSTALLED:
|
|
220
|
+
global _PGVECTOR_MISSING_LOGGED
|
|
221
|
+
if not _PGVECTOR_MISSING_LOGGED:
|
|
222
|
+
logger.debug("pgvector not installed - skipping vector type support")
|
|
223
|
+
_PGVECTOR_MISSING_LOGGED = True
|
|
224
|
+
return
|
|
225
|
+
|
|
226
|
+
try:
|
|
227
|
+
pgvector_asyncpg = importlib.import_module("pgvector.asyncpg")
|
|
228
|
+
await pgvector_asyncpg.register_vector(connection)
|
|
229
|
+
except Exception:
|
|
230
|
+
logger.exception("Failed to register pgvector support")
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def apply_driver_features(
|
|
234
|
+
statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
|
|
235
|
+
) -> "tuple[StatementConfig, dict[str, Any]]":
|
|
236
|
+
"""Apply AsyncPG driver feature defaults to statement config."""
|
|
237
|
+
processed_features: dict[str, Any] = dict(driver_features) if driver_features else {}
|
|
238
|
+
|
|
239
|
+
serializer = processed_features.setdefault("json_serializer", to_json)
|
|
240
|
+
deserializer = processed_features.setdefault("json_deserializer", from_json)
|
|
241
|
+
processed_features.setdefault("enable_json_codecs", True)
|
|
242
|
+
processed_features.setdefault("enable_pgvector", PGVECTOR_INSTALLED)
|
|
243
|
+
processed_features.setdefault("enable_cloud_sql", False)
|
|
244
|
+
processed_features.setdefault("enable_alloydb", False)
|
|
245
|
+
|
|
246
|
+
parameter_config = configure_parameter_serializers(
|
|
247
|
+
statement_config.parameter_config, serializer, deserializer=deserializer
|
|
248
|
+
)
|
|
249
|
+
statement_config = statement_config.replace(parameter_config=parameter_config)
|
|
250
|
+
|
|
251
|
+
return statement_config, processed_features
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def parse_status(status: Any) -> int:
|
|
255
|
+
"""Parse AsyncPG status string to extract row count.
|
|
256
|
+
|
|
257
|
+
AsyncPG returns status strings like "INSERT 0 1", "UPDATE 3", "DELETE 2"
|
|
258
|
+
for non-SELECT operations. This method extracts the affected row count.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
status: Status string from AsyncPG operation.
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
Number of affected rows, or 0 if cannot parse.
|
|
265
|
+
"""
|
|
266
|
+
if not status or not isinstance(status, str):
|
|
267
|
+
return 0
|
|
268
|
+
|
|
269
|
+
match = ASYNC_PG_STATUS_REGEX.match(status.strip())
|
|
270
|
+
if match:
|
|
271
|
+
groups = match.groups()
|
|
272
|
+
if len(groups) >= EXPECTED_REGEX_GROUPS:
|
|
273
|
+
try:
|
|
274
|
+
return int(groups[-1])
|
|
275
|
+
except (ValueError, IndexError):
|
|
276
|
+
pass
|
|
277
|
+
|
|
278
|
+
return 0
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def _create_postgres_error(
|
|
282
|
+
error: Any, code: "str | None", error_class: type[SQLSpecError], description: str
|
|
283
|
+
) -> SQLSpecError:
|
|
284
|
+
"""Create a SQLSpec exception from an asyncpg error.
|
|
285
|
+
|
|
286
|
+
Args:
|
|
287
|
+
error: The original asyncpg exception
|
|
288
|
+
code: PostgreSQL SQLSTATE error code
|
|
289
|
+
error_class: The SQLSpec exception class to instantiate
|
|
290
|
+
description: Human-readable description of the error type
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
A new SQLSpec exception instance with the original as its cause
|
|
294
|
+
"""
|
|
295
|
+
msg = f"PostgreSQL {description} [{code}]: {error}" if code else f"PostgreSQL {description}: {error}"
|
|
296
|
+
exc = error_class(msg)
|
|
297
|
+
exc.__cause__ = error
|
|
298
|
+
return exc
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def create_mapped_exception(error: Any) -> SQLSpecError:
|
|
302
|
+
"""Map asyncpg exceptions to SQLSpec exceptions.
|
|
303
|
+
|
|
304
|
+
This is a factory function that returns an exception instance rather than
|
|
305
|
+
raising. This pattern is more robust for use in __aexit__ handlers and
|
|
306
|
+
avoids issues with exception control flow in different Python versions.
|
|
307
|
+
|
|
308
|
+
Args:
|
|
309
|
+
error: The asyncpg exception to map
|
|
310
|
+
|
|
311
|
+
Returns:
|
|
312
|
+
A SQLSpec exception that wraps the original error
|
|
313
|
+
"""
|
|
314
|
+
# Check specific exception types first
|
|
315
|
+
if isinstance(error, asyncpg.exceptions.UniqueViolationError):
|
|
316
|
+
return _create_postgres_error(error, "23505", UniqueViolationError, "unique constraint violation")
|
|
317
|
+
if isinstance(error, asyncpg.exceptions.ForeignKeyViolationError):
|
|
318
|
+
return _create_postgres_error(error, "23503", ForeignKeyViolationError, "foreign key constraint violation")
|
|
319
|
+
if isinstance(error, asyncpg.exceptions.NotNullViolationError):
|
|
320
|
+
return _create_postgres_error(error, "23502", NotNullViolationError, "not-null constraint violation")
|
|
321
|
+
if isinstance(error, asyncpg.exceptions.CheckViolationError):
|
|
322
|
+
return _create_postgres_error(error, "23514", CheckViolationError, "check constraint violation")
|
|
323
|
+
if isinstance(error, asyncpg.exceptions.PostgresSyntaxError):
|
|
324
|
+
return _create_postgres_error(error, "42601", SQLParsingError, "SQL syntax error")
|
|
325
|
+
|
|
326
|
+
# Fall back to SQLSTATE code mapping
|
|
327
|
+
error_code = error.sqlstate if has_sqlstate(error) and error.sqlstate is not None else None
|
|
328
|
+
if not error_code:
|
|
329
|
+
return _create_postgres_error(error, None, SQLSpecError, "database error")
|
|
330
|
+
|
|
331
|
+
if error_code == "23505":
|
|
332
|
+
return _create_postgres_error(error, error_code, UniqueViolationError, "unique constraint violation")
|
|
333
|
+
if error_code == "23503":
|
|
334
|
+
return _create_postgres_error(error, error_code, ForeignKeyViolationError, "foreign key constraint violation")
|
|
335
|
+
if error_code == "23502":
|
|
336
|
+
return _create_postgres_error(error, error_code, NotNullViolationError, "not-null constraint violation")
|
|
337
|
+
if error_code == "23514":
|
|
338
|
+
return _create_postgres_error(error, error_code, CheckViolationError, "check constraint violation")
|
|
339
|
+
if error_code.startswith("23"):
|
|
340
|
+
return _create_postgres_error(error, error_code, IntegrityError, "integrity constraint violation")
|
|
341
|
+
if error_code.startswith("42"):
|
|
342
|
+
return _create_postgres_error(error, error_code, SQLParsingError, "SQL syntax error")
|
|
343
|
+
if error_code.startswith("08"):
|
|
344
|
+
return _create_postgres_error(error, error_code, DatabaseConnectionError, "connection error")
|
|
345
|
+
if error_code.startswith("40"):
|
|
346
|
+
return _create_postgres_error(error, error_code, TransactionError, "transaction error")
|
|
347
|
+
if error_code.startswith("22"):
|
|
348
|
+
return _create_postgres_error(error, error_code, DataError, "data error")
|
|
349
|
+
if error_code.startswith(("53", "54", "55", "57", "58")):
|
|
350
|
+
return _create_postgres_error(error, error_code, OperationalError, "operational error")
|
|
351
|
+
return _create_postgres_error(error, error_code, SQLSpecError, "database error")
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def collect_rows(records: "list[Any] | None") -> "tuple[list[dict[str, Any]], list[str]]":
|
|
355
|
+
"""Collect AsyncPG records into dictionaries and column names.
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
records: Records returned from asyncpg fetch.
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
Tuple of (rows, column_names).
|
|
362
|
+
"""
|
|
363
|
+
if not records:
|
|
364
|
+
return [], []
|
|
365
|
+
rows = [dict(record) for record in records]
|
|
366
|
+
column_names = list(records[0].keys())
|
|
367
|
+
return rows, column_names
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""PostgreSQL-specific data dictionary for metadata queries via asyncpg."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from sqlspec.driver import AsyncDataDictionaryBase
|
|
6
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from sqlspec.adapters.asyncpg.driver import AsyncpgDriver
|
|
10
|
+
|
|
11
|
+
__all__ = ("AsyncpgDataDictionary",)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class AsyncpgDataDictionary(AsyncDataDictionaryBase):
|
|
15
|
+
"""PostgreSQL-specific async data dictionary."""
|
|
16
|
+
|
|
17
|
+
dialect: ClassVar[str] = "postgres"
|
|
18
|
+
|
|
19
|
+
def __init__(self) -> None:
|
|
20
|
+
super().__init__()
|
|
21
|
+
|
|
22
|
+
def resolve_schema(self, schema: "str | None") -> "str | None":
|
|
23
|
+
"""Return a schema name using dialect defaults when missing."""
|
|
24
|
+
if schema is not None:
|
|
25
|
+
return schema
|
|
26
|
+
return self.get_dialect_config().default_schema
|
|
27
|
+
|
|
28
|
+
async def get_version(self, driver: "AsyncpgDriver") -> "VersionInfo | None":
|
|
29
|
+
"""Get PostgreSQL database version information.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
driver: Async database driver instance.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
PostgreSQL version information or None if detection fails.
|
|
36
|
+
|
|
37
|
+
"""
|
|
38
|
+
driver_id = id(driver)
|
|
39
|
+
# Inline cache check to avoid cross-module method call that causes mypyc segfault
|
|
40
|
+
if driver_id in self._version_fetch_attempted:
|
|
41
|
+
return self._version_cache.get(driver_id)
|
|
42
|
+
# Not cached, fetch from database
|
|
43
|
+
|
|
44
|
+
version_value = await driver.select_value_or_none(self.get_query("version"))
|
|
45
|
+
if not version_value:
|
|
46
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
47
|
+
self.cache_version(driver_id, None)
|
|
48
|
+
return None
|
|
49
|
+
|
|
50
|
+
config = self.get_dialect_config()
|
|
51
|
+
version_info = self.parse_version_with_pattern(config.version_pattern, str(version_value))
|
|
52
|
+
if version_info is None:
|
|
53
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
54
|
+
self.cache_version(driver_id, None)
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
58
|
+
self.cache_version(id(driver), version_info)
|
|
59
|
+
return version_info
|
|
60
|
+
|
|
61
|
+
async def get_feature_flag(self, driver: "AsyncpgDriver", feature: str) -> bool:
|
|
62
|
+
"""Check if PostgreSQL database supports a specific feature.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
driver: Async database driver instance.
|
|
66
|
+
feature: Feature name to check.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
True if feature is supported, False otherwise.
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
version_info = await self.get_version(driver)
|
|
73
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
74
|
+
|
|
75
|
+
async def get_optimal_type(self, driver: "AsyncpgDriver", type_category: str) -> str:
|
|
76
|
+
"""Get optimal PostgreSQL type for a category.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
driver: Async database driver instance.
|
|
80
|
+
type_category: Type category.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
PostgreSQL-specific type name.
|
|
84
|
+
|
|
85
|
+
"""
|
|
86
|
+
config = self.get_dialect_config()
|
|
87
|
+
version_info = await self.get_version(driver)
|
|
88
|
+
|
|
89
|
+
if type_category == "json":
|
|
90
|
+
jsonb_version = config.get_feature_version("supports_jsonb")
|
|
91
|
+
json_version = config.get_feature_version("supports_json")
|
|
92
|
+
if version_info and jsonb_version and version_info >= jsonb_version:
|
|
93
|
+
return "JSONB"
|
|
94
|
+
if version_info and json_version and version_info >= json_version:
|
|
95
|
+
return "JSON"
|
|
96
|
+
return "TEXT"
|
|
97
|
+
|
|
98
|
+
return config.get_optimal_type(type_category)
|
|
99
|
+
|
|
100
|
+
def list_available_features(self) -> "list[str]":
|
|
101
|
+
"""List available feature flags for this dialect."""
|
|
102
|
+
config = self.get_dialect_config()
|
|
103
|
+
features = set(config.feature_flags.keys()) | set(config.feature_versions.keys())
|
|
104
|
+
return sorted(features)
|
|
105
|
+
|
|
106
|
+
async def get_tables(self, driver: "AsyncpgDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
107
|
+
"""Get tables sorted by topological dependency order using Recursive CTE."""
|
|
108
|
+
schema_name = self.resolve_schema(schema)
|
|
109
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
110
|
+
return await driver.select(
|
|
111
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
async def get_columns(
|
|
115
|
+
self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
116
|
+
) -> "list[ColumnMetadata]":
|
|
117
|
+
"""Get column information for a table or schema."""
|
|
118
|
+
schema_name = self.resolve_schema(schema)
|
|
119
|
+
if table is None:
|
|
120
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
121
|
+
return await driver.select(
|
|
122
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
126
|
+
return await driver.select(
|
|
127
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
async def get_indexes(
|
|
131
|
+
self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
132
|
+
) -> "list[IndexMetadata]":
|
|
133
|
+
"""Get index metadata for a table or schema."""
|
|
134
|
+
schema_name = self.resolve_schema(schema)
|
|
135
|
+
if table is None:
|
|
136
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
137
|
+
return await driver.select(
|
|
138
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
142
|
+
return await driver.select(
|
|
143
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
async def get_foreign_keys(
|
|
147
|
+
self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
148
|
+
) -> "list[ForeignKeyMetadata]":
|
|
149
|
+
"""Get foreign key metadata."""
|
|
150
|
+
schema_name = self.resolve_schema(schema)
|
|
151
|
+
if table is None:
|
|
152
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
153
|
+
return await driver.select(
|
|
154
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
155
|
+
)
|
|
156
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
157
|
+
return await driver.select(
|
|
158
|
+
self.get_query("foreign_keys_by_table"),
|
|
159
|
+
schema_name=schema_name,
|
|
160
|
+
table_name=table,
|
|
161
|
+
schema_type=ForeignKeyMetadata,
|
|
162
|
+
)
|