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,352 @@
|
|
|
1
|
+
"""Spanner configuration."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast
|
|
4
|
+
|
|
5
|
+
from google.cloud.spanner_v1 import Client
|
|
6
|
+
from google.cloud.spanner_v1.pool import AbstractSessionPool, FixedSizePool
|
|
7
|
+
from typing_extensions import NotRequired
|
|
8
|
+
|
|
9
|
+
from sqlspec.adapters.spanner._typing import SpannerConnection
|
|
10
|
+
from sqlspec.adapters.spanner.core import apply_driver_features, default_statement_config
|
|
11
|
+
from sqlspec.adapters.spanner.driver import SpannerSessionContext, SpannerSyncDriver
|
|
12
|
+
from sqlspec.config import SyncDatabaseConfig
|
|
13
|
+
from sqlspec.exceptions import ImproperConfigurationError
|
|
14
|
+
from sqlspec.extensions.events import EventRuntimeHints
|
|
15
|
+
from sqlspec.utils.config_tools import normalize_connection_config, reject_pool_aliases
|
|
16
|
+
from sqlspec.utils.type_guards import supports_close
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from collections.abc import Callable
|
|
20
|
+
|
|
21
|
+
from google.auth.credentials import Credentials
|
|
22
|
+
from google.cloud.spanner_v1.database import Database
|
|
23
|
+
|
|
24
|
+
from sqlspec.config import ExtensionConfigs
|
|
25
|
+
from sqlspec.core import StatementConfig
|
|
26
|
+
from sqlspec.observability import ObservabilityConfig
|
|
27
|
+
|
|
28
|
+
__all__ = ("SpannerConnectionParams", "SpannerDriverFeatures", "SpannerPoolParams", "SpannerSyncConfig")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SpannerConnectionParams(TypedDict):
|
|
32
|
+
"""Spanner connection parameters."""
|
|
33
|
+
|
|
34
|
+
project: "NotRequired[str]"
|
|
35
|
+
instance_id: "NotRequired[str]"
|
|
36
|
+
database_id: "NotRequired[str]"
|
|
37
|
+
credentials: "NotRequired[Credentials]"
|
|
38
|
+
client_options: "NotRequired[dict[str, Any]]"
|
|
39
|
+
extra: "NotRequired[dict[str, Any]]"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class SpannerPoolParams(SpannerConnectionParams):
|
|
43
|
+
"""Session pool configuration."""
|
|
44
|
+
|
|
45
|
+
pool_type: "NotRequired[type[AbstractSessionPool]]"
|
|
46
|
+
min_sessions: "NotRequired[int]"
|
|
47
|
+
max_sessions: "NotRequired[int]"
|
|
48
|
+
labels: "NotRequired[dict[str, str]]"
|
|
49
|
+
ping_interval: "NotRequired[int]"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class SpannerDriverFeatures(TypedDict):
|
|
53
|
+
"""Driver feature flags for Spanner.
|
|
54
|
+
|
|
55
|
+
Attributes:
|
|
56
|
+
enable_uuid_conversion: Enable automatic UUID string conversion.
|
|
57
|
+
json_serializer: Custom JSON serializer for parameter conversion.
|
|
58
|
+
json_deserializer: Custom JSON deserializer for result conversion.
|
|
59
|
+
session_labels: Labels to apply to Spanner sessions.
|
|
60
|
+
enable_events: Enable database event channel support.
|
|
61
|
+
Defaults to True when extension_config["events"] is configured.
|
|
62
|
+
events_backend: Backend type for event handling.
|
|
63
|
+
Spanner only supports "table_queue" (no native pub/sub).
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
enable_uuid_conversion: "NotRequired[bool]"
|
|
67
|
+
json_serializer: "NotRequired[Callable[[Any], str]]"
|
|
68
|
+
json_deserializer: "NotRequired[Callable[[str], Any]]"
|
|
69
|
+
session_labels: "NotRequired[dict[str, str]]"
|
|
70
|
+
enable_events: "NotRequired[bool]"
|
|
71
|
+
events_backend: "NotRequired[str]"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class SpannerConnectionContext:
|
|
75
|
+
"""Context manager for Spanner connections."""
|
|
76
|
+
|
|
77
|
+
__slots__ = ("_config", "_connection", "_session", "_transaction")
|
|
78
|
+
|
|
79
|
+
def __init__(self, config: "SpannerSyncConfig", transaction: bool = False) -> None:
|
|
80
|
+
self._config = config
|
|
81
|
+
self._transaction = transaction
|
|
82
|
+
self._connection: SpannerConnection | None = None
|
|
83
|
+
self._session: Any = None
|
|
84
|
+
|
|
85
|
+
def __enter__(self) -> SpannerConnection:
|
|
86
|
+
database = self._config.get_database()
|
|
87
|
+
if self._transaction:
|
|
88
|
+
self._session = cast("Any", database).session()
|
|
89
|
+
self._session.create()
|
|
90
|
+
try:
|
|
91
|
+
txn = self._session.transaction()
|
|
92
|
+
txn.__enter__()
|
|
93
|
+
self._connection = cast("SpannerConnection", txn)
|
|
94
|
+
except Exception:
|
|
95
|
+
self._session.delete()
|
|
96
|
+
raise
|
|
97
|
+
else:
|
|
98
|
+
return self._connection
|
|
99
|
+
else:
|
|
100
|
+
self._session = cast("Any", database).snapshot(multi_use=True)
|
|
101
|
+
self._connection = cast("SpannerConnection", self._session.__enter__())
|
|
102
|
+
return self._connection
|
|
103
|
+
|
|
104
|
+
def __exit__(
|
|
105
|
+
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
|
|
106
|
+
) -> bool | None:
|
|
107
|
+
if self._transaction and self._connection:
|
|
108
|
+
txn = cast("Any", self._connection)
|
|
109
|
+
try:
|
|
110
|
+
if exc_type is None:
|
|
111
|
+
try:
|
|
112
|
+
txn_id = txn._transaction_id
|
|
113
|
+
except AttributeError:
|
|
114
|
+
txn_id = None
|
|
115
|
+
try:
|
|
116
|
+
committed = txn.committed
|
|
117
|
+
except AttributeError:
|
|
118
|
+
committed = None
|
|
119
|
+
if txn_id is not None and committed is None:
|
|
120
|
+
txn.commit()
|
|
121
|
+
else:
|
|
122
|
+
try:
|
|
123
|
+
rollback_txn_id = txn._transaction_id
|
|
124
|
+
except AttributeError:
|
|
125
|
+
rollback_txn_id = None
|
|
126
|
+
if rollback_txn_id is not None:
|
|
127
|
+
txn.rollback()
|
|
128
|
+
finally:
|
|
129
|
+
if self._session:
|
|
130
|
+
self._session.delete()
|
|
131
|
+
elif self._session:
|
|
132
|
+
self._session.__exit__(exc_type, exc_val, exc_tb)
|
|
133
|
+
|
|
134
|
+
self._connection = None
|
|
135
|
+
self._session = None
|
|
136
|
+
return None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class _SpannerSessionConnectionHandler:
|
|
140
|
+
__slots__ = ("_connection_ctx",)
|
|
141
|
+
|
|
142
|
+
def __init__(self, connection_ctx: "SpannerConnectionContext") -> None:
|
|
143
|
+
self._connection_ctx = connection_ctx
|
|
144
|
+
|
|
145
|
+
def acquire_connection(self) -> "SpannerConnection":
|
|
146
|
+
return self._connection_ctx.__enter__()
|
|
147
|
+
|
|
148
|
+
def release_connection(
|
|
149
|
+
self,
|
|
150
|
+
_conn: "SpannerConnection",
|
|
151
|
+
exc_type: "type[BaseException] | None",
|
|
152
|
+
exc_val: "BaseException | None",
|
|
153
|
+
exc_tb: Any,
|
|
154
|
+
) -> None:
|
|
155
|
+
self._connection_ctx.__exit__(exc_type, exc_val, exc_tb)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class SpannerSyncConfig(SyncDatabaseConfig["SpannerConnection", "AbstractSessionPool", SpannerSyncDriver]):
|
|
159
|
+
"""Spanner configuration and session management."""
|
|
160
|
+
|
|
161
|
+
driver_type: ClassVar[type["SpannerSyncDriver"]] = SpannerSyncDriver
|
|
162
|
+
connection_type: ClassVar[type["SpannerConnection"]] = cast("type[SpannerConnection]", SpannerConnection)
|
|
163
|
+
supports_transactional_ddl: ClassVar[bool] = False
|
|
164
|
+
supports_native_arrow_export: ClassVar[bool] = True
|
|
165
|
+
supports_native_arrow_import: ClassVar[bool] = True
|
|
166
|
+
supports_native_parquet_export: ClassVar[bool] = False
|
|
167
|
+
supports_native_parquet_import: ClassVar[bool] = False
|
|
168
|
+
requires_staging_for_load: ClassVar[bool] = False
|
|
169
|
+
|
|
170
|
+
def __init__(
|
|
171
|
+
self,
|
|
172
|
+
*,
|
|
173
|
+
connection_config: "SpannerPoolParams | dict[str, Any] | None" = None,
|
|
174
|
+
connection_instance: "AbstractSessionPool | None" = None,
|
|
175
|
+
migration_config: "dict[str, Any] | None" = None,
|
|
176
|
+
statement_config: "StatementConfig | None" = None,
|
|
177
|
+
driver_features: "SpannerDriverFeatures | dict[str, Any] | None" = None,
|
|
178
|
+
bind_key: "str | None" = None,
|
|
179
|
+
extension_config: "ExtensionConfigs | None" = None,
|
|
180
|
+
observability_config: "ObservabilityConfig | None" = None,
|
|
181
|
+
**kwargs: Any,
|
|
182
|
+
) -> None:
|
|
183
|
+
reject_pool_aliases(kwargs)
|
|
184
|
+
|
|
185
|
+
self.connection_config = normalize_connection_config(connection_config)
|
|
186
|
+
|
|
187
|
+
self.connection_config.setdefault("min_sessions", 1)
|
|
188
|
+
self.connection_config.setdefault("max_sessions", 10)
|
|
189
|
+
self.connection_config.setdefault("pool_type", FixedSizePool)
|
|
190
|
+
|
|
191
|
+
driver_features = apply_driver_features(driver_features)
|
|
192
|
+
|
|
193
|
+
statement_config = statement_config or default_statement_config
|
|
194
|
+
|
|
195
|
+
super().__init__(
|
|
196
|
+
connection_config=self.connection_config,
|
|
197
|
+
connection_instance=connection_instance,
|
|
198
|
+
migration_config=migration_config,
|
|
199
|
+
statement_config=statement_config,
|
|
200
|
+
driver_features=driver_features,
|
|
201
|
+
bind_key=bind_key,
|
|
202
|
+
extension_config=extension_config,
|
|
203
|
+
observability_config=observability_config,
|
|
204
|
+
**kwargs,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
self._client: Client | None = None
|
|
208
|
+
self._database: Database | None = None
|
|
209
|
+
|
|
210
|
+
def _get_client(self) -> Client:
|
|
211
|
+
if self._client is None:
|
|
212
|
+
self._client = Client(
|
|
213
|
+
project=self.connection_config.get("project"),
|
|
214
|
+
credentials=self.connection_config.get("credentials"),
|
|
215
|
+
client_options=self.connection_config.get("client_options"),
|
|
216
|
+
)
|
|
217
|
+
return self._client
|
|
218
|
+
|
|
219
|
+
def get_database(self) -> "Database":
|
|
220
|
+
instance_id = self.connection_config.get("instance_id")
|
|
221
|
+
database_id = self.connection_config.get("database_id")
|
|
222
|
+
if not instance_id or not database_id:
|
|
223
|
+
msg = "instance_id and database_id are required."
|
|
224
|
+
raise ImproperConfigurationError(msg)
|
|
225
|
+
|
|
226
|
+
if self.connection_instance is None:
|
|
227
|
+
self.connection_instance = self.provide_pool()
|
|
228
|
+
|
|
229
|
+
if self._database is None:
|
|
230
|
+
client = self._get_client()
|
|
231
|
+
self._database = client.instance(instance_id).database(database_id, pool=self.connection_instance) # type: ignore[no-untyped-call]
|
|
232
|
+
return self._database
|
|
233
|
+
|
|
234
|
+
def create_connection(self) -> SpannerConnection:
|
|
235
|
+
instance_id = self.connection_config.get("instance_id")
|
|
236
|
+
database_id = self.connection_config.get("database_id")
|
|
237
|
+
if not instance_id or not database_id:
|
|
238
|
+
msg = "instance_id and database_id are required."
|
|
239
|
+
raise ImproperConfigurationError(msg)
|
|
240
|
+
|
|
241
|
+
if self.connection_instance is None:
|
|
242
|
+
self.connection_instance = self.provide_pool()
|
|
243
|
+
|
|
244
|
+
client = self._get_client()
|
|
245
|
+
database = client.instance(instance_id).database(database_id, pool=self.connection_instance) # type: ignore[no-untyped-call]
|
|
246
|
+
return cast("SpannerConnection", database.snapshot())
|
|
247
|
+
|
|
248
|
+
def _create_pool(self) -> AbstractSessionPool:
|
|
249
|
+
instance_id = self.connection_config.get("instance_id")
|
|
250
|
+
database_id = self.connection_config.get("database_id")
|
|
251
|
+
if not instance_id or not database_id:
|
|
252
|
+
msg = "instance_id and database_id are required."
|
|
253
|
+
raise ImproperConfigurationError(msg)
|
|
254
|
+
|
|
255
|
+
pool_type = cast("type[AbstractSessionPool]", self.connection_config.get("pool_type", FixedSizePool))
|
|
256
|
+
|
|
257
|
+
pool_kwargs: dict[str, Any] = {}
|
|
258
|
+
if pool_type is FixedSizePool:
|
|
259
|
+
if "size" in self.connection_config:
|
|
260
|
+
pool_kwargs["size"] = self.connection_config["size"]
|
|
261
|
+
elif "max_sessions" in self.connection_config:
|
|
262
|
+
pool_kwargs["size"] = self.connection_config["max_sessions"]
|
|
263
|
+
if "labels" in self.connection_config:
|
|
264
|
+
pool_kwargs["labels"] = self.connection_config["labels"]
|
|
265
|
+
else:
|
|
266
|
+
valid_pool_keys = {"size", "labels", "ping_interval"}
|
|
267
|
+
pool_kwargs = {k: v for k, v in self.connection_config.items() if k in valid_pool_keys and v is not None}
|
|
268
|
+
if "size" not in pool_kwargs and "max_sessions" in self.connection_config:
|
|
269
|
+
pool_kwargs["size"] = self.connection_config["max_sessions"]
|
|
270
|
+
|
|
271
|
+
pool_factory = cast("Callable[..., AbstractSessionPool]", pool_type)
|
|
272
|
+
return pool_factory(**pool_kwargs)
|
|
273
|
+
|
|
274
|
+
def _close_pool(self) -> None:
|
|
275
|
+
if self.connection_instance and supports_close(self.connection_instance):
|
|
276
|
+
self.connection_instance.close()
|
|
277
|
+
|
|
278
|
+
def provide_connection(self, *args: Any, transaction: "bool" = False, **kwargs: Any) -> "SpannerConnectionContext":
|
|
279
|
+
"""Yield a Snapshot (default) or Transaction context from the configured pool.
|
|
280
|
+
|
|
281
|
+
Args:
|
|
282
|
+
*args: Additional positional arguments (unused, for interface compatibility).
|
|
283
|
+
transaction: If True, yields a Transaction context that supports
|
|
284
|
+
execute_update() for DML statements. If False (default), yields
|
|
285
|
+
a read-only Snapshot context for SELECT queries.
|
|
286
|
+
**kwargs: Additional keyword arguments (unused, for interface compatibility).
|
|
287
|
+
"""
|
|
288
|
+
return SpannerConnectionContext(self, transaction=transaction)
|
|
289
|
+
|
|
290
|
+
def provide_session(
|
|
291
|
+
self, *args: Any, statement_config: "StatementConfig | None" = None, transaction: "bool" = False, **kwargs: Any
|
|
292
|
+
) -> "SpannerSessionContext":
|
|
293
|
+
"""Provide a Spanner driver session context manager.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
*args: Additional arguments.
|
|
297
|
+
statement_config: Optional statement configuration override.
|
|
298
|
+
transaction: Whether to use a transaction.
|
|
299
|
+
**kwargs: Additional keyword arguments.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
A Spanner driver session context manager.
|
|
303
|
+
"""
|
|
304
|
+
connection_ctx = SpannerConnectionContext(self, transaction=transaction)
|
|
305
|
+
handler = _SpannerSessionConnectionHandler(connection_ctx)
|
|
306
|
+
|
|
307
|
+
return SpannerSessionContext(
|
|
308
|
+
acquire_connection=handler.acquire_connection,
|
|
309
|
+
release_connection=handler.release_connection,
|
|
310
|
+
statement_config=statement_config or self.statement_config or default_statement_config,
|
|
311
|
+
driver_features=self.driver_features,
|
|
312
|
+
prepare_driver=self._prepare_driver,
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
def provide_write_session(
|
|
316
|
+
self, *args: Any, statement_config: "StatementConfig | None" = None, **kwargs: Any
|
|
317
|
+
) -> "SpannerSessionContext":
|
|
318
|
+
"""Provide a Spanner driver write session context manager.
|
|
319
|
+
|
|
320
|
+
Args:
|
|
321
|
+
*args: Additional arguments.
|
|
322
|
+
statement_config: Optional statement configuration override.
|
|
323
|
+
**kwargs: Additional keyword arguments.
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
A Spanner driver write session context manager.
|
|
327
|
+
"""
|
|
328
|
+
return self.provide_session(*args, statement_config=statement_config, transaction=True, **kwargs)
|
|
329
|
+
|
|
330
|
+
def get_signature_namespace(self) -> "dict[str, Any]":
|
|
331
|
+
"""Get the signature namespace for SpannerSyncConfig types.
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
Dictionary mapping type names to types.
|
|
335
|
+
"""
|
|
336
|
+
namespace = super().get_signature_namespace()
|
|
337
|
+
namespace.update({
|
|
338
|
+
"SpannerConnectionContext": SpannerConnectionContext,
|
|
339
|
+
"SpannerConnection": SpannerConnection,
|
|
340
|
+
"SpannerConnectionParams": SpannerConnectionParams,
|
|
341
|
+
"SpannerDriverFeatures": SpannerDriverFeatures,
|
|
342
|
+
"SpannerPoolParams": SpannerPoolParams,
|
|
343
|
+
"SpannerSessionContext": SpannerSessionContext,
|
|
344
|
+
"SpannerSyncConfig": SpannerSyncConfig,
|
|
345
|
+
"SpannerSyncDriver": SpannerSyncDriver,
|
|
346
|
+
})
|
|
347
|
+
return namespace
|
|
348
|
+
|
|
349
|
+
def get_event_runtime_hints(self) -> "EventRuntimeHints":
|
|
350
|
+
"""Return queue defaults for Spanner JSON handling."""
|
|
351
|
+
|
|
352
|
+
return EventRuntimeHints(json_passthrough=True)
|
|
Binary file
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""Spanner adapter compiled helpers."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from google.api_core import exceptions as api_exceptions
|
|
6
|
+
|
|
7
|
+
from sqlspec.adapters.spanner.type_converter import coerce_params_for_spanner, infer_spanner_param_types
|
|
8
|
+
from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
|
|
9
|
+
from sqlspec.exceptions import (
|
|
10
|
+
DatabaseConnectionError,
|
|
11
|
+
NotFoundError,
|
|
12
|
+
OperationalError,
|
|
13
|
+
SQLParsingError,
|
|
14
|
+
SQLSpecError,
|
|
15
|
+
UniqueViolationError,
|
|
16
|
+
)
|
|
17
|
+
from sqlspec.utils.arrow_helpers import convert_dict_to_arrow
|
|
18
|
+
from sqlspec.utils.serializers import from_json, to_json
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
22
|
+
|
|
23
|
+
from sqlspec.typing import ArrowRecordBatch, ArrowRecordBatchReader, ArrowReturnFormat, ArrowTable
|
|
24
|
+
|
|
25
|
+
__all__ = (
|
|
26
|
+
"apply_driver_features",
|
|
27
|
+
"build_profile",
|
|
28
|
+
"build_statement_config",
|
|
29
|
+
"coerce_params",
|
|
30
|
+
"collect_rows",
|
|
31
|
+
"create_arrow_data",
|
|
32
|
+
"create_mapped_exception",
|
|
33
|
+
"default_statement_config",
|
|
34
|
+
"driver_profile",
|
|
35
|
+
"infer_param_types",
|
|
36
|
+
"supports_batch_update",
|
|
37
|
+
"supports_write",
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def build_profile() -> "DriverParameterProfile":
|
|
42
|
+
"""Create the Spanner driver parameter profile."""
|
|
43
|
+
|
|
44
|
+
return DriverParameterProfile(
|
|
45
|
+
name="Spanner",
|
|
46
|
+
default_style=ParameterStyle.NAMED_AT,
|
|
47
|
+
supported_styles={ParameterStyle.NAMED_AT},
|
|
48
|
+
default_execution_style=ParameterStyle.NAMED_AT,
|
|
49
|
+
supported_execution_styles={ParameterStyle.NAMED_AT},
|
|
50
|
+
has_native_list_expansion=True,
|
|
51
|
+
json_serializer_strategy="none",
|
|
52
|
+
default_dialect="spanner",
|
|
53
|
+
preserve_parameter_format=True,
|
|
54
|
+
needs_static_script_compilation=False,
|
|
55
|
+
allow_mixed_parameter_styles=False,
|
|
56
|
+
preserve_original_params_for_many=True,
|
|
57
|
+
custom_type_coercions=None,
|
|
58
|
+
extras={},
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
driver_profile = build_profile()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def build_statement_config() -> StatementConfig:
|
|
66
|
+
"""Construct the Spanner statement configuration."""
|
|
67
|
+
profile = driver_profile
|
|
68
|
+
return build_statement_config_from_profile(profile, statement_overrides={"dialect": "spanner"})
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
default_statement_config = build_statement_config()
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def apply_driver_features(driver_features: "Mapping[str, Any] | None") -> "dict[str, Any]":
|
|
75
|
+
"""Apply Spanner driver feature defaults."""
|
|
76
|
+
processed_features: dict[str, Any] = dict(driver_features) if driver_features else {}
|
|
77
|
+
processed_features.setdefault("enable_uuid_conversion", True)
|
|
78
|
+
processed_features.setdefault("json_serializer", to_json)
|
|
79
|
+
processed_features.setdefault("json_deserializer", from_json)
|
|
80
|
+
return processed_features
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def supports_write(cursor: Any) -> bool:
|
|
84
|
+
"""Return True when the cursor supports DML execution."""
|
|
85
|
+
try:
|
|
86
|
+
_ = cursor.execute_update
|
|
87
|
+
except AttributeError:
|
|
88
|
+
return False
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def supports_batch_update(cursor: Any) -> bool:
|
|
93
|
+
"""Return True when the cursor supports batch updates."""
|
|
94
|
+
try:
|
|
95
|
+
_ = cursor.batch_update
|
|
96
|
+
except AttributeError:
|
|
97
|
+
return False
|
|
98
|
+
return True
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def infer_param_types(params: "dict[str, Any] | list[Any] | tuple[Any, ...] | None") -> "dict[str, Any]":
|
|
102
|
+
"""Infer Spanner param_types from Python values."""
|
|
103
|
+
if not isinstance(params, dict):
|
|
104
|
+
return {}
|
|
105
|
+
return infer_spanner_param_types(params)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def coerce_params(
|
|
109
|
+
params: "dict[str, Any] | list[Any] | tuple[Any, ...] | None",
|
|
110
|
+
*,
|
|
111
|
+
json_serializer: "Callable[[Any], str] | None" = None,
|
|
112
|
+
) -> "dict[str, Any] | None":
|
|
113
|
+
"""Coerce Python types to Spanner-compatible formats."""
|
|
114
|
+
if not isinstance(params, dict):
|
|
115
|
+
return None
|
|
116
|
+
return coerce_params_for_spanner(params, json_serializer=json_serializer)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def collect_rows(
|
|
120
|
+
rows: "Sequence[Any]", fields: "Sequence[Any]", converter: Any
|
|
121
|
+
) -> "tuple[list[dict[str, Any]], list[str]]":
|
|
122
|
+
"""Collect Spanner rows into dictionaries.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
rows: Rows from result set.
|
|
126
|
+
fields: Result set fields metadata.
|
|
127
|
+
converter: Type converter for row values.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Tuple of (rows, column_names).
|
|
131
|
+
"""
|
|
132
|
+
column_names = [field.name for field in fields]
|
|
133
|
+
data: list[dict[str, Any]] = []
|
|
134
|
+
for row in rows:
|
|
135
|
+
item: dict[str, Any] = {}
|
|
136
|
+
for index, column in enumerate(column_names):
|
|
137
|
+
item[column] = converter.convert_if_detected(row[index])
|
|
138
|
+
data.append(item)
|
|
139
|
+
return data, column_names
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def create_arrow_data(
|
|
143
|
+
data: "list[dict[str, Any]]", return_format: "ArrowReturnFormat"
|
|
144
|
+
) -> "ArrowTable | ArrowRecordBatch | ArrowRecordBatchReader | list[ArrowRecordBatch]":
|
|
145
|
+
"""Create Arrow data from Spanner row dictionaries.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
data: Row dictionaries from Spanner results.
|
|
149
|
+
return_format: Arrow return format.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
Arrow data in the requested format.
|
|
153
|
+
"""
|
|
154
|
+
return convert_dict_to_arrow(data, return_format=return_format)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _create_spanner_error(error: Any, error_class: type[SQLSpecError], description: str) -> SQLSpecError:
|
|
158
|
+
"""Create a Spanner error instance without raising it."""
|
|
159
|
+
msg = f"Spanner {description}: {error}"
|
|
160
|
+
exc = error_class(msg)
|
|
161
|
+
exc.__cause__ = error
|
|
162
|
+
return exc
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def create_mapped_exception(error: Any) -> SQLSpecError:
|
|
166
|
+
"""Map Spanner exceptions to SQLSpec exceptions.
|
|
167
|
+
|
|
168
|
+
This is a factory function that returns an exception instance rather than
|
|
169
|
+
raising. This pattern is more robust for use in __exit__ handlers and
|
|
170
|
+
avoids issues with exception control flow in different Python versions.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
error: The Spanner exception to map
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
A SQLSpec exception that wraps the original error
|
|
177
|
+
"""
|
|
178
|
+
if isinstance(error, api_exceptions.AlreadyExists):
|
|
179
|
+
return _create_spanner_error(error, UniqueViolationError, "resource already exists")
|
|
180
|
+
if isinstance(error, api_exceptions.NotFound):
|
|
181
|
+
return _create_spanner_error(error, NotFoundError, "resource not found")
|
|
182
|
+
if isinstance(error, api_exceptions.InvalidArgument):
|
|
183
|
+
return _create_spanner_error(error, SQLParsingError, "invalid query or argument")
|
|
184
|
+
if isinstance(error, api_exceptions.PermissionDenied):
|
|
185
|
+
return _create_spanner_error(error, DatabaseConnectionError, "permission denied")
|
|
186
|
+
if isinstance(error, (api_exceptions.ServiceUnavailable, api_exceptions.TooManyRequests)):
|
|
187
|
+
return _create_spanner_error(error, OperationalError, "service unavailable or rate limited")
|
|
188
|
+
return _create_spanner_error(error, SQLSpecError, "error")
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""Spanner metadata queries using INFORMATION_SCHEMA."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from mypy_extensions import mypyc_attr
|
|
6
|
+
|
|
7
|
+
from sqlspec.driver import SyncDataDictionaryBase
|
|
8
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
9
|
+
|
|
10
|
+
__all__ = ("SpannerDataDictionary",)
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from sqlspec.adapters.spanner.driver import SpannerSyncDriver
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
17
|
+
class SpannerDataDictionary(SyncDataDictionaryBase):
|
|
18
|
+
"""Fetch table, column, and index metadata from Spanner."""
|
|
19
|
+
|
|
20
|
+
dialect: ClassVar[str] = "spanner"
|
|
21
|
+
|
|
22
|
+
def __init__(self) -> None:
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
def get_version(self, driver: "SpannerSyncDriver") -> "VersionInfo | None":
|
|
26
|
+
"""Get Spanner version information.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
driver: Spanner driver instance.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
None since Spanner does not expose version information.
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
_ = driver
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
def get_feature_flag(self, driver: "SpannerSyncDriver", feature: str) -> bool:
|
|
39
|
+
"""Check if Spanner supports a specific feature.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
driver: Spanner driver instance.
|
|
43
|
+
feature: Feature name to check.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
True if feature is supported, False otherwise.
|
|
47
|
+
|
|
48
|
+
"""
|
|
49
|
+
_ = driver
|
|
50
|
+
return self.resolve_feature_flag(feature, None)
|
|
51
|
+
|
|
52
|
+
def get_optimal_type(self, driver: "SpannerSyncDriver", type_category: str) -> str:
|
|
53
|
+
"""Get optimal Spanner type for a category.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
driver: Spanner driver instance.
|
|
57
|
+
type_category: Type category.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Spanner-specific type name.
|
|
61
|
+
|
|
62
|
+
"""
|
|
63
|
+
_ = driver
|
|
64
|
+
return self.get_dialect_config().get_optimal_type(type_category)
|
|
65
|
+
|
|
66
|
+
def get_tables(self, driver: "SpannerSyncDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
67
|
+
"""Get tables using INFORMATION_SCHEMA."""
|
|
68
|
+
schema_name = self.resolve_schema(schema)
|
|
69
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
70
|
+
return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata)
|
|
71
|
+
|
|
72
|
+
def get_columns(
|
|
73
|
+
self, driver: "SpannerSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
74
|
+
) -> "list[ColumnMetadata]":
|
|
75
|
+
"""Get column information for a table or schema."""
|
|
76
|
+
schema_name = self.resolve_schema(schema)
|
|
77
|
+
if table is None:
|
|
78
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
79
|
+
return driver.select(
|
|
80
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
84
|
+
return driver.select(
|
|
85
|
+
self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
def get_indexes(
|
|
89
|
+
self, driver: "SpannerSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
90
|
+
) -> "list[IndexMetadata]":
|
|
91
|
+
"""Get index metadata for a table or schema."""
|
|
92
|
+
schema_name = self.resolve_schema(schema)
|
|
93
|
+
if table is None:
|
|
94
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
95
|
+
return driver.select(
|
|
96
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
100
|
+
return driver.select(
|
|
101
|
+
self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
def get_foreign_keys(
|
|
105
|
+
self, driver: "SpannerSyncDriver", table: "str | None" = None, schema: "str | None" = None
|
|
106
|
+
) -> "list[ForeignKeyMetadata]":
|
|
107
|
+
"""Get foreign key metadata."""
|
|
108
|
+
schema_name = self.resolve_schema(schema)
|
|
109
|
+
if table is None:
|
|
110
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
111
|
+
return driver.select(
|
|
112
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
113
|
+
)
|
|
114
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
115
|
+
return driver.select(
|
|
116
|
+
self.get_query("foreign_keys_by_table"),
|
|
117
|
+
table_name=table,
|
|
118
|
+
schema_name=schema_name,
|
|
119
|
+
schema_type=ForeignKeyMetadata,
|
|
120
|
+
)
|