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