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,450 @@
|
|
|
1
|
+
"""psycopg adapter compiled helpers."""
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
from typing import TYPE_CHECKING, Any, NamedTuple, cast
|
|
5
|
+
|
|
6
|
+
from psycopg import sql as psycopg_sql
|
|
7
|
+
|
|
8
|
+
from sqlspec.core import (
|
|
9
|
+
SQL,
|
|
10
|
+
DriverParameterProfile,
|
|
11
|
+
ParameterStyle,
|
|
12
|
+
StatementConfig,
|
|
13
|
+
build_statement_config_from_profile,
|
|
14
|
+
)
|
|
15
|
+
from sqlspec.driver import ExecutionResult
|
|
16
|
+
from sqlspec.exceptions import (
|
|
17
|
+
CheckViolationError,
|
|
18
|
+
DatabaseConnectionError,
|
|
19
|
+
DataError,
|
|
20
|
+
ForeignKeyViolationError,
|
|
21
|
+
IntegrityError,
|
|
22
|
+
NotNullViolationError,
|
|
23
|
+
OperationalError,
|
|
24
|
+
SQLParsingError,
|
|
25
|
+
SQLSpecError,
|
|
26
|
+
TransactionError,
|
|
27
|
+
UniqueViolationError,
|
|
28
|
+
)
|
|
29
|
+
from sqlspec.typing import PGVECTOR_INSTALLED
|
|
30
|
+
from sqlspec.utils.serializers import to_json
|
|
31
|
+
from sqlspec.utils.type_converters import build_json_list_converter, build_json_tuple_converter
|
|
32
|
+
from sqlspec.utils.type_guards import has_rowcount, has_sqlstate
|
|
33
|
+
|
|
34
|
+
if TYPE_CHECKING:
|
|
35
|
+
from collections.abc import Callable, Mapping
|
|
36
|
+
|
|
37
|
+
from sqlspec.core import ParameterStyleConfig, StackOperation
|
|
38
|
+
|
|
39
|
+
__all__ = (
|
|
40
|
+
"PipelineCursorEntry",
|
|
41
|
+
"PreparedStackOperation",
|
|
42
|
+
"apply_driver_features",
|
|
43
|
+
"build_async_pipeline_execution_result",
|
|
44
|
+
"build_copy_from_command",
|
|
45
|
+
"build_pipeline_execution_result",
|
|
46
|
+
"build_profile",
|
|
47
|
+
"build_statement_config",
|
|
48
|
+
"build_truncate_command",
|
|
49
|
+
"collect_rows",
|
|
50
|
+
"create_mapped_exception",
|
|
51
|
+
"default_statement_config",
|
|
52
|
+
"driver_profile",
|
|
53
|
+
"execute_with_optional_parameters",
|
|
54
|
+
"execute_with_optional_parameters_async",
|
|
55
|
+
"executemany_or_skip",
|
|
56
|
+
"executemany_or_skip_async",
|
|
57
|
+
"pipeline_supported",
|
|
58
|
+
"resolve_rowcount",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
TRANSACTION_STATUS_IDLE = 0
|
|
62
|
+
TRANSACTION_STATUS_ACTIVE = 1
|
|
63
|
+
TRANSACTION_STATUS_INTRANS = 2
|
|
64
|
+
TRANSACTION_STATUS_INERROR = 3
|
|
65
|
+
TRANSACTION_STATUS_UNKNOWN = 4
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class PreparedStackOperation(NamedTuple):
|
|
69
|
+
"""Precompiled stack operation metadata for psycopg pipeline execution."""
|
|
70
|
+
|
|
71
|
+
operation_index: int
|
|
72
|
+
operation: "StackOperation"
|
|
73
|
+
statement: "SQL"
|
|
74
|
+
sql: str
|
|
75
|
+
parameters: "tuple[Any, ...] | dict[str, Any] | None"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class PipelineCursorEntry(NamedTuple):
|
|
79
|
+
"""Cursor pending result data for psycopg pipeline execution."""
|
|
80
|
+
|
|
81
|
+
prepared: "PreparedStackOperation"
|
|
82
|
+
cursor: Any
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def pipeline_supported() -> bool:
|
|
86
|
+
"""Return True when libpq pipeline support is available."""
|
|
87
|
+
try:
|
|
88
|
+
import psycopg
|
|
89
|
+
|
|
90
|
+
capabilities = psycopg.capabilities
|
|
91
|
+
except (ImportError, AttributeError):
|
|
92
|
+
return False
|
|
93
|
+
try:
|
|
94
|
+
return bool(capabilities.has_pipeline())
|
|
95
|
+
except Exception:
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _compose_table_identifier(table: str) -> "psycopg_sql.Composed":
|
|
100
|
+
parts = [part for part in table.split(".") if part]
|
|
101
|
+
if not parts:
|
|
102
|
+
msg = "Table name must not be empty"
|
|
103
|
+
raise SQLSpecError(msg)
|
|
104
|
+
identifiers = [psycopg_sql.Identifier(part) for part in parts]
|
|
105
|
+
return psycopg_sql.SQL(".").join(identifiers)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def build_copy_from_command(table: str, columns: "list[str]") -> "psycopg_sql.Composed":
|
|
109
|
+
table_identifier = _compose_table_identifier(table)
|
|
110
|
+
column_sql = psycopg_sql.SQL(", ").join([psycopg_sql.Identifier(column) for column in columns])
|
|
111
|
+
return psycopg_sql.SQL("COPY {} ({}) FROM STDIN").format(table_identifier, column_sql)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def build_truncate_command(table: str) -> "psycopg_sql.Composed":
|
|
115
|
+
return psycopg_sql.SQL("TRUNCATE TABLE {}").format(_compose_table_identifier(table))
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _identity(value: Any) -> Any:
|
|
119
|
+
return value
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _build_psycopg_custom_type_coercions() -> "dict[type, Callable[[Any], Any]]":
|
|
123
|
+
"""Return custom type coercions for psycopg."""
|
|
124
|
+
|
|
125
|
+
return {datetime.datetime: _identity, datetime.date: _identity, datetime.time: _identity}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _build_psycopg_parameter_config(
|
|
129
|
+
profile: "DriverParameterProfile", serializer: "Callable[[Any], str]"
|
|
130
|
+
) -> "ParameterStyleConfig":
|
|
131
|
+
"""Construct parameter configuration with shared JSON serializer support.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
profile: Driver parameter profile to extend.
|
|
135
|
+
serializer: JSON serializer for parameter coercion.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
ParameterStyleConfig with updated type coercions.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
base_config = build_statement_config_from_profile(profile, json_serializer=serializer).parameter_config
|
|
142
|
+
|
|
143
|
+
updated_type_map = dict(base_config.type_coercion_map)
|
|
144
|
+
updated_type_map[list] = build_json_list_converter(serializer)
|
|
145
|
+
updated_type_map[tuple] = build_json_tuple_converter(serializer)
|
|
146
|
+
|
|
147
|
+
return base_config.replace(type_coercion_map=updated_type_map)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def build_profile() -> "DriverParameterProfile":
|
|
151
|
+
"""Create the psycopg driver parameter profile."""
|
|
152
|
+
|
|
153
|
+
return DriverParameterProfile(
|
|
154
|
+
name="Psycopg",
|
|
155
|
+
default_style=ParameterStyle.POSITIONAL_PYFORMAT,
|
|
156
|
+
supported_styles={
|
|
157
|
+
ParameterStyle.POSITIONAL_PYFORMAT,
|
|
158
|
+
ParameterStyle.NAMED_PYFORMAT,
|
|
159
|
+
ParameterStyle.NUMERIC,
|
|
160
|
+
ParameterStyle.QMARK,
|
|
161
|
+
},
|
|
162
|
+
default_execution_style=ParameterStyle.POSITIONAL_PYFORMAT,
|
|
163
|
+
supported_execution_styles={ParameterStyle.POSITIONAL_PYFORMAT, ParameterStyle.NAMED_PYFORMAT},
|
|
164
|
+
has_native_list_expansion=True,
|
|
165
|
+
preserve_parameter_format=True,
|
|
166
|
+
needs_static_script_compilation=False,
|
|
167
|
+
allow_mixed_parameter_styles=False,
|
|
168
|
+
preserve_original_params_for_many=False,
|
|
169
|
+
json_serializer_strategy="helper",
|
|
170
|
+
custom_type_coercions=_build_psycopg_custom_type_coercions(),
|
|
171
|
+
default_dialect="postgres",
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
driver_profile = build_profile()
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def build_statement_config(*, json_serializer: "Callable[[Any], str] | None" = None) -> "StatementConfig":
|
|
179
|
+
"""Construct the psycopg statement configuration with optional JSON codecs."""
|
|
180
|
+
serializer = json_serializer or to_json
|
|
181
|
+
profile = driver_profile
|
|
182
|
+
parameter_config = _build_psycopg_parameter_config(profile, serializer)
|
|
183
|
+
base_config = build_statement_config_from_profile(profile, json_serializer=serializer)
|
|
184
|
+
return base_config.replace(parameter_config=parameter_config)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
default_statement_config = build_statement_config()
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def apply_driver_features(
|
|
191
|
+
statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
|
|
192
|
+
) -> "tuple[StatementConfig, dict[str, Any]]":
|
|
193
|
+
"""Apply psycopg driver feature defaults to statement config."""
|
|
194
|
+
features: dict[str, Any] = dict(driver_features) if driver_features else {}
|
|
195
|
+
serializer = features.get("json_serializer", to_json)
|
|
196
|
+
features.setdefault("json_serializer", serializer)
|
|
197
|
+
features.setdefault("enable_pgvector", PGVECTOR_INSTALLED)
|
|
198
|
+
|
|
199
|
+
parameter_config = _build_psycopg_parameter_config(driver_profile, serializer)
|
|
200
|
+
statement_config = statement_config.replace(parameter_config=parameter_config)
|
|
201
|
+
|
|
202
|
+
return statement_config, features
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def collect_rows(fetched_data: "list[Any] | None", description: "list[Any] | None") -> "tuple[list[Any], list[str]]":
|
|
206
|
+
"""Collect psycopg rows and column names.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
fetched_data: Rows returned from cursor.fetchall().
|
|
210
|
+
description: Cursor description metadata.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
Tuple of (rows, column_names).
|
|
214
|
+
"""
|
|
215
|
+
if not description:
|
|
216
|
+
return [], []
|
|
217
|
+
column_names = [col.name for col in description]
|
|
218
|
+
return fetched_data or [], column_names
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def execute_with_optional_parameters(cursor: Any, sql: str, parameters: Any) -> None:
|
|
222
|
+
"""Execute statement with optional parameters.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
cursor: Psycopg cursor object.
|
|
226
|
+
sql: SQL string to execute.
|
|
227
|
+
parameters: Prepared parameters payload.
|
|
228
|
+
"""
|
|
229
|
+
if parameters:
|
|
230
|
+
cursor.execute(sql, parameters)
|
|
231
|
+
else:
|
|
232
|
+
cursor.execute(sql)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
async def execute_with_optional_parameters_async(cursor: Any, sql: str, parameters: Any) -> None:
|
|
236
|
+
"""Execute statement with optional parameters in async mode.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
cursor: Psycopg async cursor object.
|
|
240
|
+
sql: SQL string to execute.
|
|
241
|
+
parameters: Prepared parameters payload.
|
|
242
|
+
"""
|
|
243
|
+
if parameters:
|
|
244
|
+
await cursor.execute(sql, parameters)
|
|
245
|
+
else:
|
|
246
|
+
await cursor.execute(sql)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def executemany_or_skip(cursor: Any, sql: str, parameters: Any) -> bool:
|
|
250
|
+
"""Execute executemany when parameters are provided.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
cursor: Psycopg cursor object.
|
|
254
|
+
sql: SQL string to execute.
|
|
255
|
+
parameters: Prepared parameters payload.
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
True when executemany was executed.
|
|
259
|
+
"""
|
|
260
|
+
if not parameters:
|
|
261
|
+
return False
|
|
262
|
+
cursor.executemany(sql, parameters)
|
|
263
|
+
return True
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
async def executemany_or_skip_async(cursor: Any, sql: str, parameters: Any) -> bool:
|
|
267
|
+
"""Execute executemany when parameters are provided in async mode.
|
|
268
|
+
|
|
269
|
+
Args:
|
|
270
|
+
cursor: Psycopg async cursor object.
|
|
271
|
+
sql: SQL string to execute.
|
|
272
|
+
parameters: Prepared parameters payload.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
True when executemany was executed.
|
|
276
|
+
"""
|
|
277
|
+
if not parameters:
|
|
278
|
+
return False
|
|
279
|
+
await cursor.executemany(sql, parameters)
|
|
280
|
+
return True
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def resolve_rowcount(cursor: Any) -> int:
|
|
284
|
+
"""Resolve rowcount from a psycopg cursor.
|
|
285
|
+
|
|
286
|
+
Args:
|
|
287
|
+
cursor: Psycopg cursor with optional rowcount metadata.
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
Positive rowcount value or 0 when unknown.
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
if not has_rowcount(cursor):
|
|
294
|
+
return 0
|
|
295
|
+
rowcount = cursor.rowcount
|
|
296
|
+
if isinstance(rowcount, int) and rowcount > 0:
|
|
297
|
+
return rowcount
|
|
298
|
+
return 0
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def build_pipeline_execution_result(statement: "SQL", cursor: Any) -> "ExecutionResult":
|
|
302
|
+
"""Build an ExecutionResult for psycopg pipeline execution.
|
|
303
|
+
|
|
304
|
+
Args:
|
|
305
|
+
statement: SQL statement executed by the pipeline.
|
|
306
|
+
cursor: Psycopg cursor holding the pipeline result.
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
ExecutionResult representing the pipeline operation.
|
|
310
|
+
"""
|
|
311
|
+
|
|
312
|
+
if statement.returns_rows():
|
|
313
|
+
fetched_data = cursor.fetchall()
|
|
314
|
+
fetched_data, column_names = collect_rows(cast("list[Any] | None", fetched_data), cursor.description)
|
|
315
|
+
return ExecutionResult(
|
|
316
|
+
cursor_result=cursor,
|
|
317
|
+
rowcount_override=None,
|
|
318
|
+
special_data=None,
|
|
319
|
+
selected_data=fetched_data,
|
|
320
|
+
column_names=column_names,
|
|
321
|
+
data_row_count=len(fetched_data),
|
|
322
|
+
statement_count=None,
|
|
323
|
+
successful_statements=None,
|
|
324
|
+
is_script_result=False,
|
|
325
|
+
is_select_result=True,
|
|
326
|
+
is_many_result=False,
|
|
327
|
+
last_inserted_id=None,
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
affected_rows = resolve_rowcount(cursor)
|
|
331
|
+
return ExecutionResult(
|
|
332
|
+
cursor_result=cursor,
|
|
333
|
+
rowcount_override=affected_rows,
|
|
334
|
+
special_data=None,
|
|
335
|
+
selected_data=None,
|
|
336
|
+
column_names=None,
|
|
337
|
+
data_row_count=None,
|
|
338
|
+
statement_count=None,
|
|
339
|
+
successful_statements=None,
|
|
340
|
+
is_script_result=False,
|
|
341
|
+
is_select_result=False,
|
|
342
|
+
is_many_result=False,
|
|
343
|
+
last_inserted_id=None,
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
async def build_async_pipeline_execution_result(statement: "SQL", cursor: Any) -> "ExecutionResult":
|
|
348
|
+
"""Build an ExecutionResult for psycopg async pipeline execution.
|
|
349
|
+
|
|
350
|
+
Args:
|
|
351
|
+
statement: SQL statement executed by the pipeline.
|
|
352
|
+
cursor: Psycopg cursor holding the pipeline result.
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
ExecutionResult representing the pipeline operation.
|
|
356
|
+
"""
|
|
357
|
+
|
|
358
|
+
if statement.returns_rows():
|
|
359
|
+
fetched_data = await cursor.fetchall()
|
|
360
|
+
fetched_data, column_names = collect_rows(cast("list[Any] | None", fetched_data), cursor.description)
|
|
361
|
+
return ExecutionResult(
|
|
362
|
+
cursor_result=cursor,
|
|
363
|
+
rowcount_override=None,
|
|
364
|
+
special_data=None,
|
|
365
|
+
selected_data=fetched_data,
|
|
366
|
+
column_names=column_names,
|
|
367
|
+
data_row_count=len(fetched_data),
|
|
368
|
+
statement_count=None,
|
|
369
|
+
successful_statements=None,
|
|
370
|
+
is_script_result=False,
|
|
371
|
+
is_select_result=True,
|
|
372
|
+
is_many_result=False,
|
|
373
|
+
last_inserted_id=None,
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
affected_rows = resolve_rowcount(cursor)
|
|
377
|
+
return ExecutionResult(
|
|
378
|
+
cursor_result=cursor,
|
|
379
|
+
rowcount_override=affected_rows,
|
|
380
|
+
special_data=None,
|
|
381
|
+
selected_data=None,
|
|
382
|
+
column_names=None,
|
|
383
|
+
data_row_count=None,
|
|
384
|
+
statement_count=None,
|
|
385
|
+
successful_statements=None,
|
|
386
|
+
is_script_result=False,
|
|
387
|
+
is_select_result=False,
|
|
388
|
+
is_many_result=False,
|
|
389
|
+
last_inserted_id=None,
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def _create_postgres_error(
|
|
394
|
+
error: Any, code: "str | None", error_class: type[SQLSpecError], description: str
|
|
395
|
+
) -> SQLSpecError:
|
|
396
|
+
"""Create a SQLSpec exception from a psycopg error.
|
|
397
|
+
|
|
398
|
+
Args:
|
|
399
|
+
error: The original psycopg exception
|
|
400
|
+
code: PostgreSQL SQLSTATE error code
|
|
401
|
+
error_class: The SQLSpec exception class to instantiate
|
|
402
|
+
description: Human-readable description of the error type
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
A new SQLSpec exception instance with the original as its cause
|
|
406
|
+
"""
|
|
407
|
+
msg = f"PostgreSQL {description} [{code}]: {error}" if code else f"PostgreSQL {description}: {error}"
|
|
408
|
+
exc = error_class(msg)
|
|
409
|
+
exc.__cause__ = error
|
|
410
|
+
return exc
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
def create_mapped_exception(error: Any) -> SQLSpecError:
|
|
414
|
+
"""Map psycopg exceptions to SQLSpec exceptions.
|
|
415
|
+
|
|
416
|
+
This is a factory function that returns an exception instance rather than
|
|
417
|
+
raising. This pattern is more robust for use in __exit__ handlers and
|
|
418
|
+
avoids issues with exception control flow in different Python versions.
|
|
419
|
+
|
|
420
|
+
Args:
|
|
421
|
+
error: The psycopg exception to map
|
|
422
|
+
|
|
423
|
+
Returns:
|
|
424
|
+
A SQLSpec exception that wraps the original error
|
|
425
|
+
"""
|
|
426
|
+
error_code = error.sqlstate if has_sqlstate(error) and error.sqlstate is not None else None
|
|
427
|
+
if not error_code:
|
|
428
|
+
return _create_postgres_error(error, None, SQLSpecError, "database error")
|
|
429
|
+
|
|
430
|
+
if error_code == "23505":
|
|
431
|
+
return _create_postgres_error(error, error_code, UniqueViolationError, "unique constraint violation")
|
|
432
|
+
if error_code == "23503":
|
|
433
|
+
return _create_postgres_error(error, error_code, ForeignKeyViolationError, "foreign key constraint violation")
|
|
434
|
+
if error_code == "23502":
|
|
435
|
+
return _create_postgres_error(error, error_code, NotNullViolationError, "not-null constraint violation")
|
|
436
|
+
if error_code == "23514":
|
|
437
|
+
return _create_postgres_error(error, error_code, CheckViolationError, "check constraint violation")
|
|
438
|
+
if error_code.startswith("23"):
|
|
439
|
+
return _create_postgres_error(error, error_code, IntegrityError, "integrity constraint violation")
|
|
440
|
+
if error_code.startswith("42"):
|
|
441
|
+
return _create_postgres_error(error, error_code, SQLParsingError, "SQL syntax error")
|
|
442
|
+
if error_code.startswith("08"):
|
|
443
|
+
return _create_postgres_error(error, error_code, DatabaseConnectionError, "connection error")
|
|
444
|
+
if error_code.startswith("40"):
|
|
445
|
+
return _create_postgres_error(error, error_code, TransactionError, "transaction error")
|
|
446
|
+
if error_code.startswith("22"):
|
|
447
|
+
return _create_postgres_error(error, error_code, DataError, "data error")
|
|
448
|
+
if error_code.startswith(("53", "54", "55", "57", "58")):
|
|
449
|
+
return _create_postgres_error(error, error_code, OperationalError, "operational error")
|
|
450
|
+
return _create_postgres_error(error, error_code, SQLSpecError, "database error")
|