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,128 @@
|
|
|
1
|
+
"""BigQuery-specific data dictionary for metadata queries."""
|
|
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__ = ("BigQueryDataDictionary",)
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from sqlspec.adapters.bigquery.driver import BigQueryDriver
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
17
|
+
class BigQueryDataDictionary(SyncDataDictionaryBase):
|
|
18
|
+
"""BigQuery-specific sync data dictionary."""
|
|
19
|
+
|
|
20
|
+
dialect: ClassVar[str] = "bigquery"
|
|
21
|
+
|
|
22
|
+
def __init__(self) -> None:
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
def get_version(self, driver: "BigQueryDriver") -> "VersionInfo | None":
|
|
26
|
+
"""Return BigQuery version information.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
driver: BigQuery driver instance.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
None because BigQuery does not expose version info.
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
_ = driver
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
def get_feature_flag(self, driver: "BigQueryDriver", feature: str) -> bool:
|
|
39
|
+
"""Check if BigQuery supports a specific feature.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
driver: BigQuery 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: "BigQueryDriver", type_category: str) -> str:
|
|
53
|
+
"""Get optimal BigQuery type for a category.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
driver: BigQuery driver instance.
|
|
57
|
+
type_category: Type category.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
BigQuery-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: "BigQueryDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
67
|
+
"""Get tables sorted by topological dependency order using BigQuery catalog."""
|
|
68
|
+
self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="tables")
|
|
69
|
+
if schema:
|
|
70
|
+
tables_table = f"`{schema}.INFORMATION_SCHEMA.TABLES`"
|
|
71
|
+
kcu_table = f"`{schema}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE`"
|
|
72
|
+
rc_table = f"`{schema}.INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS`"
|
|
73
|
+
else:
|
|
74
|
+
tables_table = "INFORMATION_SCHEMA.TABLES"
|
|
75
|
+
kcu_table = "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"
|
|
76
|
+
rc_table = "INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS"
|
|
77
|
+
|
|
78
|
+
query_text = self.get_query_text("tables_by_schema").format(
|
|
79
|
+
tables_table=tables_table, kcu_table=kcu_table, rc_table=rc_table
|
|
80
|
+
)
|
|
81
|
+
return driver.select(query_text, schema_type=TableMetadata)
|
|
82
|
+
|
|
83
|
+
def get_columns(
|
|
84
|
+
self, driver: "BigQueryDriver", table: "str | None" = None, schema: "str | None" = None
|
|
85
|
+
) -> "list[ColumnMetadata]":
|
|
86
|
+
"""Get column information for a table or schema."""
|
|
87
|
+
schema_prefix = f"`{schema}`." if schema else ""
|
|
88
|
+
if table is None:
|
|
89
|
+
self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="columns")
|
|
90
|
+
query_text = self.get_query_text("columns_by_schema").format(schema_prefix=schema_prefix)
|
|
91
|
+
return driver.select(query_text, schema_name=schema, schema_type=ColumnMetadata)
|
|
92
|
+
|
|
93
|
+
self._log_table_describe(driver, schema_name=schema, table_name=table, operation="columns")
|
|
94
|
+
query_text = self.get_query_text("columns_by_table").format(schema_prefix=schema_prefix)
|
|
95
|
+
return driver.select(query_text, table_name=table, schema_name=schema, schema_type=ColumnMetadata)
|
|
96
|
+
|
|
97
|
+
def get_indexes(
|
|
98
|
+
self, driver: "BigQueryDriver", table: "str | None" = None, schema: "str | None" = None
|
|
99
|
+
) -> "list[IndexMetadata]":
|
|
100
|
+
"""Get index metadata for a table or schema."""
|
|
101
|
+
if table is None:
|
|
102
|
+
self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="indexes")
|
|
103
|
+
return driver.select(self.get_query("indexes_by_schema"), schema_type=IndexMetadata)
|
|
104
|
+
|
|
105
|
+
self._log_table_describe(driver, schema_name=schema, table_name=table, operation="indexes")
|
|
106
|
+
return driver.select(self.get_query("indexes_by_table"), schema_type=IndexMetadata)
|
|
107
|
+
|
|
108
|
+
def get_foreign_keys(
|
|
109
|
+
self, driver: "BigQueryDriver", table: "str | None" = None, schema: "str | None" = None
|
|
110
|
+
) -> "list[ForeignKeyMetadata]":
|
|
111
|
+
"""Get foreign key metadata."""
|
|
112
|
+
if table is None:
|
|
113
|
+
self._log_schema_introspect(driver, schema_name=schema, table_name=None, operation="foreign_keys")
|
|
114
|
+
else:
|
|
115
|
+
self._log_table_describe(driver, schema_name=schema, table_name=table, operation="foreign_keys")
|
|
116
|
+
if schema:
|
|
117
|
+
kcu_table = f"`{schema}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE`"
|
|
118
|
+
rc_table = f"`{schema}.INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS`"
|
|
119
|
+
else:
|
|
120
|
+
kcu_table = "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"
|
|
121
|
+
rc_table = "INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS"
|
|
122
|
+
|
|
123
|
+
if table is None:
|
|
124
|
+
query_text = self.get_query_text("foreign_keys_by_schema").format(kcu_table=kcu_table, rc_table=rc_table)
|
|
125
|
+
return driver.select(query_text, schema_name=schema, schema_type=ForeignKeyMetadata)
|
|
126
|
+
|
|
127
|
+
query_text = self.get_query_text("foreign_keys_by_table").format(kcu_table=kcu_table, rc_table=rc_table)
|
|
128
|
+
return driver.select(query_text, table_name=table, schema_name=schema, schema_type=ForeignKeyMetadata)
|
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
# ruff: noqa: F401
|
|
2
|
+
"""BigQuery driver implementation.
|
|
3
|
+
|
|
4
|
+
Provides Google Cloud BigQuery connectivity with parameter style conversion,
|
|
5
|
+
type coercion, error handling, and query job management.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import io
|
|
9
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
10
|
+
|
|
11
|
+
from google.cloud.exceptions import GoogleCloudError
|
|
12
|
+
|
|
13
|
+
from sqlspec.adapters.bigquery._typing import BigQueryConnection, BigQuerySessionContext
|
|
14
|
+
from sqlspec.adapters.bigquery.core import (
|
|
15
|
+
build_dml_rowcount,
|
|
16
|
+
build_inlined_script,
|
|
17
|
+
build_load_job_config,
|
|
18
|
+
build_load_job_telemetry,
|
|
19
|
+
build_retry,
|
|
20
|
+
collect_rows,
|
|
21
|
+
create_mapped_exception,
|
|
22
|
+
default_statement_config,
|
|
23
|
+
detect_emulator,
|
|
24
|
+
driver_profile,
|
|
25
|
+
is_simple_insert,
|
|
26
|
+
normalize_script_rowcount,
|
|
27
|
+
run_query_job,
|
|
28
|
+
storage_api_available,
|
|
29
|
+
try_bulk_insert,
|
|
30
|
+
)
|
|
31
|
+
from sqlspec.adapters.bigquery.data_dictionary import BigQueryDataDictionary
|
|
32
|
+
from sqlspec.adapters.bigquery.type_converter import BigQueryOutputConverter
|
|
33
|
+
from sqlspec.core import (
|
|
34
|
+
StatementConfig,
|
|
35
|
+
build_arrow_result_from_table,
|
|
36
|
+
build_literal_inlining_transform,
|
|
37
|
+
get_cache_config,
|
|
38
|
+
register_driver_profile,
|
|
39
|
+
)
|
|
40
|
+
from sqlspec.driver import ExecutionResult, SyncDriverAdapterBase
|
|
41
|
+
from sqlspec.exceptions import MissingDependencyError, SQLSpecError, StorageCapabilityError
|
|
42
|
+
from sqlspec.utils.logging import get_logger
|
|
43
|
+
from sqlspec.utils.module_loader import ensure_pyarrow
|
|
44
|
+
from sqlspec.utils.serializers import to_json
|
|
45
|
+
|
|
46
|
+
if TYPE_CHECKING:
|
|
47
|
+
from collections.abc import Callable
|
|
48
|
+
|
|
49
|
+
from google.cloud.bigquery import QueryJob, QueryJobConfig
|
|
50
|
+
from typing_extensions import Self
|
|
51
|
+
|
|
52
|
+
from sqlspec.builder import QueryBuilder
|
|
53
|
+
from sqlspec.core import SQL, ArrowResult, SQLResult, Statement, StatementFilter
|
|
54
|
+
from sqlspec.storage import (
|
|
55
|
+
StorageBridgeJob,
|
|
56
|
+
StorageDestination,
|
|
57
|
+
StorageFormat,
|
|
58
|
+
StorageTelemetry,
|
|
59
|
+
SyncStoragePipeline,
|
|
60
|
+
)
|
|
61
|
+
from sqlspec.typing import ArrowReturnFormat, StatementParameters
|
|
62
|
+
|
|
63
|
+
logger = get_logger(__name__)
|
|
64
|
+
|
|
65
|
+
__all__ = ("BigQueryCursor", "BigQueryDriver", "BigQueryExceptionHandler", "BigQuerySessionContext")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class BigQueryCursor:
|
|
69
|
+
"""BigQuery cursor with resource management."""
|
|
70
|
+
|
|
71
|
+
__slots__ = ("connection", "job")
|
|
72
|
+
|
|
73
|
+
def __init__(self, connection: "BigQueryConnection") -> None:
|
|
74
|
+
self.connection = connection
|
|
75
|
+
self.job: QueryJob | None = None
|
|
76
|
+
|
|
77
|
+
def __enter__(self) -> "BigQueryConnection":
|
|
78
|
+
return self.connection
|
|
79
|
+
|
|
80
|
+
def __exit__(self, *_: Any) -> None:
|
|
81
|
+
"""Clean up cursor resources including active QueryJobs."""
|
|
82
|
+
if self.job is not None:
|
|
83
|
+
try:
|
|
84
|
+
# Cancel the job if it's still running to free up resources
|
|
85
|
+
if self.job.state in {"PENDING", "RUNNING"}:
|
|
86
|
+
self.job.cancel()
|
|
87
|
+
# Clear the job reference
|
|
88
|
+
self.job = None
|
|
89
|
+
except Exception:
|
|
90
|
+
logger.exception("Failed to cancel BigQuery job during cursor cleanup")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class BigQueryExceptionHandler:
|
|
94
|
+
"""Context manager for handling BigQuery API exceptions.
|
|
95
|
+
|
|
96
|
+
Maps HTTP status codes and error reasons to specific SQLSpec exceptions
|
|
97
|
+
for better error handling in application code.
|
|
98
|
+
|
|
99
|
+
Uses deferred exception pattern for mypyc compatibility: exceptions
|
|
100
|
+
are stored in pending_exception rather than raised from __exit__
|
|
101
|
+
to avoid ABI boundary violations with compiled code.
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
__slots__ = ("pending_exception",)
|
|
105
|
+
|
|
106
|
+
def __init__(self) -> None:
|
|
107
|
+
self.pending_exception: Exception | None = None
|
|
108
|
+
|
|
109
|
+
def __enter__(self) -> "BigQueryExceptionHandler":
|
|
110
|
+
return self
|
|
111
|
+
|
|
112
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
113
|
+
_ = exc_tb
|
|
114
|
+
if exc_type is None:
|
|
115
|
+
return False
|
|
116
|
+
if issubclass(exc_type, GoogleCloudError):
|
|
117
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
118
|
+
return True
|
|
119
|
+
return False
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class BigQueryDriver(SyncDriverAdapterBase):
|
|
123
|
+
"""BigQuery driver implementation.
|
|
124
|
+
|
|
125
|
+
Provides Google Cloud BigQuery connectivity with parameter style conversion,
|
|
126
|
+
type coercion, error handling, and query job management.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
__slots__ = (
|
|
130
|
+
"_data_dictionary",
|
|
131
|
+
"_default_query_job_config",
|
|
132
|
+
"_job_retry",
|
|
133
|
+
"_job_retry_deadline",
|
|
134
|
+
"_json_serializer",
|
|
135
|
+
"_literal_inliner",
|
|
136
|
+
"_type_converter",
|
|
137
|
+
"_using_emulator",
|
|
138
|
+
)
|
|
139
|
+
dialect = "bigquery"
|
|
140
|
+
|
|
141
|
+
def __init__(
|
|
142
|
+
self,
|
|
143
|
+
connection: BigQueryConnection,
|
|
144
|
+
statement_config: "StatementConfig | None" = None,
|
|
145
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
146
|
+
) -> None:
|
|
147
|
+
features = driver_features or {}
|
|
148
|
+
|
|
149
|
+
enable_uuid_conversion = features.get("enable_uuid_conversion", True)
|
|
150
|
+
self._type_converter = BigQueryOutputConverter(enable_uuid_conversion=enable_uuid_conversion)
|
|
151
|
+
|
|
152
|
+
if statement_config is None:
|
|
153
|
+
statement_config = default_statement_config.replace(cache_config=get_cache_config())
|
|
154
|
+
|
|
155
|
+
parameter_json_serializer = statement_config.parameter_config.json_serializer
|
|
156
|
+
if parameter_json_serializer is None:
|
|
157
|
+
parameter_json_serializer = features.get("json_serializer", to_json)
|
|
158
|
+
|
|
159
|
+
self._json_serializer: Callable[[Any], str] = parameter_json_serializer
|
|
160
|
+
self._literal_inliner = build_literal_inlining_transform(json_serializer=self._json_serializer)
|
|
161
|
+
|
|
162
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
163
|
+
self._default_query_job_config: QueryJobConfig | None = (driver_features or {}).get("default_query_job_config")
|
|
164
|
+
self._data_dictionary: BigQueryDataDictionary | None = None
|
|
165
|
+
self._using_emulator = detect_emulator(connection)
|
|
166
|
+
self._job_retry_deadline = float(features.get("job_retry_deadline", 60.0))
|
|
167
|
+
self._job_retry = build_retry(self._job_retry_deadline, self._using_emulator)
|
|
168
|
+
|
|
169
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
170
|
+
# CORE DISPATCH METHODS
|
|
171
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
172
|
+
|
|
173
|
+
def dispatch_execute(self, cursor: Any, statement: "SQL") -> ExecutionResult:
|
|
174
|
+
"""Execute single SQL statement with BigQuery data handling.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
cursor: BigQuery cursor object
|
|
178
|
+
statement: SQL statement to execute
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
ExecutionResult with query results and metadata
|
|
182
|
+
"""
|
|
183
|
+
sql, parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
184
|
+
cursor.job = run_query_job(
|
|
185
|
+
cursor,
|
|
186
|
+
sql,
|
|
187
|
+
parameters,
|
|
188
|
+
default_job_config=self._default_query_job_config,
|
|
189
|
+
job_config=None,
|
|
190
|
+
json_serializer=self._json_serializer,
|
|
191
|
+
)
|
|
192
|
+
job_result = cursor.job.result(job_retry=self._job_retry)
|
|
193
|
+
statement_type = str(cursor.job.statement_type or "").upper()
|
|
194
|
+
is_select_like = (
|
|
195
|
+
statement.returns_rows() or statement_type == "SELECT" or self._should_force_select(statement, cursor)
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
if is_select_like:
|
|
199
|
+
rows_list, column_names = collect_rows(job_result, cursor.job.schema)
|
|
200
|
+
|
|
201
|
+
return self.create_execution_result(
|
|
202
|
+
cursor,
|
|
203
|
+
selected_data=rows_list,
|
|
204
|
+
column_names=column_names,
|
|
205
|
+
data_row_count=len(rows_list),
|
|
206
|
+
is_select_result=True,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
affected_rows = build_dml_rowcount(cursor.job, 0)
|
|
210
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows)
|
|
211
|
+
|
|
212
|
+
def dispatch_execute_many(self, cursor: Any, statement: "SQL") -> ExecutionResult:
|
|
213
|
+
"""BigQuery execute_many with Parquet bulk load optimization.
|
|
214
|
+
|
|
215
|
+
Uses Parquet bulk load for INSERT operations (fast path) and falls back
|
|
216
|
+
to literal inlining for UPDATE/DELETE operations.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
cursor: BigQuery cursor object
|
|
220
|
+
statement: SQL statement to execute with multiple parameter sets
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
ExecutionResult with batch execution details
|
|
224
|
+
"""
|
|
225
|
+
compiled_statement, prepared_parameters = self._get_compiled_statement(statement, self.statement_config)
|
|
226
|
+
sql = compiled_statement.compiled_sql
|
|
227
|
+
parsed_expression = compiled_statement.expression
|
|
228
|
+
|
|
229
|
+
if not prepared_parameters:
|
|
230
|
+
return self.create_execution_result(cursor, rowcount_override=0, is_many_result=True)
|
|
231
|
+
|
|
232
|
+
if isinstance(prepared_parameters, tuple):
|
|
233
|
+
prepared_parameters = list(prepared_parameters)
|
|
234
|
+
|
|
235
|
+
if not isinstance(prepared_parameters, list):
|
|
236
|
+
return self.create_execution_result(cursor, rowcount_override=0, is_many_result=True)
|
|
237
|
+
|
|
238
|
+
allow_parse = statement.statement_config.enable_parsing
|
|
239
|
+
if is_simple_insert(sql, parsed_expression, allow_parse=allow_parse):
|
|
240
|
+
rowcount = try_bulk_insert(
|
|
241
|
+
self.connection, sql, prepared_parameters, parsed_expression, allow_parse=allow_parse
|
|
242
|
+
)
|
|
243
|
+
if rowcount is not None:
|
|
244
|
+
return self.create_execution_result(cursor, rowcount_override=rowcount, is_many_result=True)
|
|
245
|
+
|
|
246
|
+
script_sql = build_inlined_script(
|
|
247
|
+
sql, prepared_parameters, parsed_expression, allow_parse=allow_parse, literal_inliner=self._literal_inliner
|
|
248
|
+
)
|
|
249
|
+
cursor.job = run_query_job(
|
|
250
|
+
cursor,
|
|
251
|
+
script_sql,
|
|
252
|
+
None,
|
|
253
|
+
default_job_config=self._default_query_job_config,
|
|
254
|
+
job_config=None,
|
|
255
|
+
json_serializer=self._json_serializer,
|
|
256
|
+
)
|
|
257
|
+
cursor.job.result(job_retry=self._job_retry)
|
|
258
|
+
affected_rows = build_dml_rowcount(cursor.job, len(prepared_parameters))
|
|
259
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows, is_many_result=True)
|
|
260
|
+
|
|
261
|
+
def dispatch_execute_script(self, cursor: Any, statement: "SQL") -> ExecutionResult:
|
|
262
|
+
"""Execute SQL script with statement splitting and parameter handling.
|
|
263
|
+
|
|
264
|
+
Parameters are embedded as static values for script execution compatibility.
|
|
265
|
+
|
|
266
|
+
Args:
|
|
267
|
+
cursor: BigQuery cursor object
|
|
268
|
+
statement: SQL statement to execute
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
ExecutionResult with script execution details
|
|
272
|
+
"""
|
|
273
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
274
|
+
statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
|
|
275
|
+
|
|
276
|
+
successful_count = 0
|
|
277
|
+
last_job = None
|
|
278
|
+
last_rowcount = 0
|
|
279
|
+
|
|
280
|
+
for stmt in statements:
|
|
281
|
+
job = run_query_job(
|
|
282
|
+
cursor,
|
|
283
|
+
stmt,
|
|
284
|
+
prepared_parameters or {},
|
|
285
|
+
default_job_config=self._default_query_job_config,
|
|
286
|
+
job_config=None,
|
|
287
|
+
json_serializer=self._json_serializer,
|
|
288
|
+
)
|
|
289
|
+
job.result(job_retry=self._job_retry)
|
|
290
|
+
last_job = job
|
|
291
|
+
last_rowcount = normalize_script_rowcount(last_rowcount, job)
|
|
292
|
+
successful_count += 1
|
|
293
|
+
|
|
294
|
+
cursor.job = last_job
|
|
295
|
+
|
|
296
|
+
return self.create_execution_result(
|
|
297
|
+
cursor,
|
|
298
|
+
statement_count=len(statements),
|
|
299
|
+
successful_statements=successful_count,
|
|
300
|
+
rowcount_override=last_rowcount,
|
|
301
|
+
is_script_result=True,
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
305
|
+
# TRANSACTION MANAGEMENT
|
|
306
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
307
|
+
|
|
308
|
+
def begin(self) -> None:
|
|
309
|
+
"""Begin transaction - BigQuery doesn't support transactions."""
|
|
310
|
+
|
|
311
|
+
def commit(self) -> None:
|
|
312
|
+
"""Commit transaction - BigQuery doesn't support transactions."""
|
|
313
|
+
|
|
314
|
+
def rollback(self) -> None:
|
|
315
|
+
"""Rollback transaction - BigQuery doesn't support transactions."""
|
|
316
|
+
|
|
317
|
+
def with_cursor(self, connection: "BigQueryConnection") -> "BigQueryCursor":
|
|
318
|
+
"""Create context manager for cursor management.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
BigQueryCursor: Cursor object for query execution
|
|
322
|
+
"""
|
|
323
|
+
return BigQueryCursor(connection)
|
|
324
|
+
|
|
325
|
+
def handle_database_exceptions(self) -> "BigQueryExceptionHandler":
|
|
326
|
+
"""Handle database-specific exceptions and wrap them appropriately."""
|
|
327
|
+
return BigQueryExceptionHandler()
|
|
328
|
+
|
|
329
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
330
|
+
# ARROW API METHODS
|
|
331
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
332
|
+
|
|
333
|
+
def select_to_arrow(
|
|
334
|
+
self,
|
|
335
|
+
statement: "Statement | QueryBuilder",
|
|
336
|
+
/,
|
|
337
|
+
*parameters: "StatementParameters | StatementFilter",
|
|
338
|
+
statement_config: "StatementConfig | None" = None,
|
|
339
|
+
return_format: "ArrowReturnFormat" = "table",
|
|
340
|
+
native_only: bool = False,
|
|
341
|
+
batch_size: int | None = None,
|
|
342
|
+
arrow_schema: Any = None,
|
|
343
|
+
**kwargs: Any,
|
|
344
|
+
) -> "ArrowResult":
|
|
345
|
+
"""Execute query and return results as Apache Arrow (BigQuery native with Storage API).
|
|
346
|
+
|
|
347
|
+
BigQuery provides native Arrow via Storage API (query_job.to_arrow()).
|
|
348
|
+
Requires google-cloud-bigquery-storage package and API enabled.
|
|
349
|
+
Falls back to dict conversion if Storage API not available.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
statement: SQL statement, string, or QueryBuilder
|
|
353
|
+
*parameters: Query parameters or filters
|
|
354
|
+
statement_config: Optional statement configuration override
|
|
355
|
+
return_format: "table" for pyarrow.Table (default), "batch" for RecordBatch,
|
|
356
|
+
"batches" for list of RecordBatch, "reader" for RecordBatchReader
|
|
357
|
+
native_only: If True, raise error if Storage API unavailable (default: False)
|
|
358
|
+
batch_size: Batch size hint (for future streaming implementation)
|
|
359
|
+
arrow_schema: Optional pyarrow.Schema for type casting
|
|
360
|
+
**kwargs: Additional keyword arguments
|
|
361
|
+
|
|
362
|
+
Returns:
|
|
363
|
+
ArrowResult with native Arrow data (if Storage API available) or converted data
|
|
364
|
+
|
|
365
|
+
Raises:
|
|
366
|
+
MissingDependencyError: If pyarrow not installed, or if Storage API not available and native_only=True
|
|
367
|
+
|
|
368
|
+
Example:
|
|
369
|
+
>>> # Will use native Arrow if Storage API available, otherwise converts
|
|
370
|
+
>>> result = driver.select_to_arrow(
|
|
371
|
+
... "SELECT * FROM dataset.users WHERE age > @age",
|
|
372
|
+
... {"age": 18},
|
|
373
|
+
... )
|
|
374
|
+
>>> df = result.to_pandas()
|
|
375
|
+
|
|
376
|
+
>>> # Force native Arrow (raises if Storage API unavailable)
|
|
377
|
+
>>> result = driver.select_to_arrow(
|
|
378
|
+
... "SELECT * FROM dataset.users", native_only=True
|
|
379
|
+
... )
|
|
380
|
+
"""
|
|
381
|
+
ensure_pyarrow()
|
|
382
|
+
|
|
383
|
+
if not storage_api_available():
|
|
384
|
+
if native_only:
|
|
385
|
+
msg = (
|
|
386
|
+
"BigQuery native Arrow requires Storage API.\n"
|
|
387
|
+
"1. Install: pip install google-cloud-bigquery-storage\n"
|
|
388
|
+
"2. Enable API: https://console.cloud.google.com/apis/library/bigquerystorage.googleapis.com\n"
|
|
389
|
+
"3. Grant permissions: roles/bigquery.dataViewer"
|
|
390
|
+
)
|
|
391
|
+
raise MissingDependencyError(
|
|
392
|
+
package="google-cloud-bigquery-storage", install_package="google-cloud-bigquery-storage"
|
|
393
|
+
) from RuntimeError(msg)
|
|
394
|
+
|
|
395
|
+
# Fallback to conversion path
|
|
396
|
+
result: ArrowResult = super().select_to_arrow(
|
|
397
|
+
statement,
|
|
398
|
+
*parameters,
|
|
399
|
+
statement_config=statement_config,
|
|
400
|
+
return_format=return_format,
|
|
401
|
+
native_only=native_only,
|
|
402
|
+
batch_size=batch_size,
|
|
403
|
+
arrow_schema=arrow_schema,
|
|
404
|
+
**kwargs,
|
|
405
|
+
)
|
|
406
|
+
return result
|
|
407
|
+
|
|
408
|
+
# Use native path with Storage API
|
|
409
|
+
# Prepare statement
|
|
410
|
+
config = statement_config or self.statement_config
|
|
411
|
+
prepared_statement = self.prepare_statement(statement, parameters, statement_config=config, kwargs=kwargs)
|
|
412
|
+
|
|
413
|
+
# Get compiled SQL and parameters
|
|
414
|
+
sql, driver_params = self._get_compiled_sql(prepared_statement, config)
|
|
415
|
+
|
|
416
|
+
with self.handle_database_exceptions():
|
|
417
|
+
query_job = run_query_job(
|
|
418
|
+
self.connection,
|
|
419
|
+
sql,
|
|
420
|
+
driver_params,
|
|
421
|
+
default_job_config=self._default_query_job_config,
|
|
422
|
+
job_config=None,
|
|
423
|
+
json_serializer=self._json_serializer,
|
|
424
|
+
)
|
|
425
|
+
query_job.result() # Wait for completion
|
|
426
|
+
|
|
427
|
+
# Native Arrow via Storage API
|
|
428
|
+
arrow_table = query_job.to_arrow()
|
|
429
|
+
|
|
430
|
+
return build_arrow_result_from_table(
|
|
431
|
+
prepared_statement,
|
|
432
|
+
arrow_table,
|
|
433
|
+
return_format=return_format,
|
|
434
|
+
batch_size=batch_size,
|
|
435
|
+
arrow_schema=arrow_schema,
|
|
436
|
+
)
|
|
437
|
+
msg = "Unreachable"
|
|
438
|
+
raise RuntimeError(msg) # pragma: no cover
|
|
439
|
+
|
|
440
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
441
|
+
# STORAGE API METHODS
|
|
442
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
443
|
+
|
|
444
|
+
def select_to_storage(
|
|
445
|
+
self,
|
|
446
|
+
statement: "Statement | QueryBuilder | SQL | str",
|
|
447
|
+
destination: "StorageDestination",
|
|
448
|
+
/,
|
|
449
|
+
*parameters: "StatementParameters | StatementFilter",
|
|
450
|
+
statement_config: "StatementConfig | None" = None,
|
|
451
|
+
partitioner: "dict[str, object] | None" = None,
|
|
452
|
+
format_hint: "StorageFormat | None" = None,
|
|
453
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
454
|
+
**kwargs: Any,
|
|
455
|
+
) -> "StorageBridgeJob":
|
|
456
|
+
"""Execute a query and persist Arrow results to a storage backend."""
|
|
457
|
+
|
|
458
|
+
self._require_capability("arrow_export_enabled")
|
|
459
|
+
arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
|
|
460
|
+
sync_pipeline = self._storage_pipeline()
|
|
461
|
+
telemetry_payload = self._write_result_to_storage_sync(
|
|
462
|
+
arrow_result, destination, format_hint=format_hint, pipeline=sync_pipeline
|
|
463
|
+
)
|
|
464
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
465
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
466
|
+
|
|
467
|
+
def load_from_arrow(
|
|
468
|
+
self,
|
|
469
|
+
table: str,
|
|
470
|
+
source: "ArrowResult | Any",
|
|
471
|
+
*,
|
|
472
|
+
partitioner: "dict[str, object] | None" = None,
|
|
473
|
+
overwrite: bool = False,
|
|
474
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
475
|
+
) -> "StorageBridgeJob":
|
|
476
|
+
"""Load Arrow data by uploading a temporary Parquet payload to BigQuery."""
|
|
477
|
+
|
|
478
|
+
self._require_capability("parquet_import_enabled")
|
|
479
|
+
arrow_table = self._coerce_arrow_table(source)
|
|
480
|
+
ensure_pyarrow()
|
|
481
|
+
|
|
482
|
+
import pyarrow.parquet as pq
|
|
483
|
+
|
|
484
|
+
buffer = io.BytesIO()
|
|
485
|
+
pq.write_table(arrow_table, buffer)
|
|
486
|
+
buffer.seek(0)
|
|
487
|
+
job_config = build_load_job_config("parquet", overwrite)
|
|
488
|
+
job = self.connection.load_table_from_file(buffer, table, job_config=job_config)
|
|
489
|
+
job.result()
|
|
490
|
+
telemetry_payload = build_load_job_telemetry(job, table, format_label="parquet")
|
|
491
|
+
if telemetry:
|
|
492
|
+
telemetry_payload.setdefault("extra", {})
|
|
493
|
+
telemetry_payload["extra"]["arrow_rows"] = telemetry.get("rows_processed")
|
|
494
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
495
|
+
return self._create_storage_job(telemetry_payload)
|
|
496
|
+
|
|
497
|
+
def load_from_storage(
|
|
498
|
+
self,
|
|
499
|
+
table: str,
|
|
500
|
+
source: "StorageDestination",
|
|
501
|
+
*,
|
|
502
|
+
file_format: "StorageFormat",
|
|
503
|
+
partitioner: "dict[str, object] | None" = None,
|
|
504
|
+
overwrite: bool = False,
|
|
505
|
+
) -> "StorageBridgeJob":
|
|
506
|
+
"""Load staged artifacts from storage into BigQuery."""
|
|
507
|
+
|
|
508
|
+
if file_format != "parquet":
|
|
509
|
+
msg = "BigQuery storage bridge currently supports Parquet ingest only"
|
|
510
|
+
raise StorageCapabilityError(msg, capability="parquet_import_enabled")
|
|
511
|
+
job_config = build_load_job_config(file_format, overwrite)
|
|
512
|
+
job = self.connection.load_table_from_uri(source, table, job_config=job_config)
|
|
513
|
+
job.result()
|
|
514
|
+
telemetry_payload = build_load_job_telemetry(job, table, format_label=file_format)
|
|
515
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
516
|
+
return self._create_storage_job(telemetry_payload)
|
|
517
|
+
|
|
518
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
519
|
+
# UTILITY METHODS
|
|
520
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
521
|
+
|
|
522
|
+
@property
|
|
523
|
+
def data_dictionary(self) -> "BigQueryDataDictionary":
|
|
524
|
+
"""Get the data dictionary for this driver.
|
|
525
|
+
|
|
526
|
+
Returns:
|
|
527
|
+
Data dictionary instance for metadata queries
|
|
528
|
+
"""
|
|
529
|
+
if self._data_dictionary is None:
|
|
530
|
+
self._data_dictionary = BigQueryDataDictionary()
|
|
531
|
+
return self._data_dictionary
|
|
532
|
+
|
|
533
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
534
|
+
# PRIVATE / INTERNAL METHODS
|
|
535
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
536
|
+
|
|
537
|
+
def _connection_in_transaction(self) -> bool:
|
|
538
|
+
"""Check if connection is in transaction.
|
|
539
|
+
|
|
540
|
+
BigQuery does not support transactions.
|
|
541
|
+
|
|
542
|
+
Returns:
|
|
543
|
+
False - BigQuery has no transaction support.
|
|
544
|
+
"""
|
|
545
|
+
return False
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
register_driver_profile("bigquery", driver_profile)
|