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,483 @@
|
|
|
1
|
+
"""MysqlConnector MySQL driver implementation.
|
|
2
|
+
|
|
3
|
+
Provides MySQL/MariaDB connectivity with parameter style conversion,
|
|
4
|
+
type coercion, error handling, and transaction management.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Final, cast
|
|
8
|
+
|
|
9
|
+
import mysql.connector
|
|
10
|
+
from mysql.connector.constants import FieldType
|
|
11
|
+
|
|
12
|
+
from sqlspec.adapters.mysqlconnector.core import (
|
|
13
|
+
build_insert_statement,
|
|
14
|
+
collect_rows,
|
|
15
|
+
create_mapped_exception,
|
|
16
|
+
default_statement_config,
|
|
17
|
+
detect_json_columns,
|
|
18
|
+
driver_profile,
|
|
19
|
+
format_identifier,
|
|
20
|
+
normalize_execute_many_parameters,
|
|
21
|
+
normalize_execute_parameters,
|
|
22
|
+
normalize_lastrowid,
|
|
23
|
+
resolve_rowcount,
|
|
24
|
+
)
|
|
25
|
+
from sqlspec.adapters.mysqlconnector.data_dictionary import (
|
|
26
|
+
MysqlConnectorAsyncDataDictionary,
|
|
27
|
+
MysqlConnectorSyncDataDictionary,
|
|
28
|
+
)
|
|
29
|
+
from sqlspec.core import ArrowResult, get_cache_config, register_driver_profile
|
|
30
|
+
from sqlspec.driver import AsyncDriverAdapterBase, SyncDriverAdapterBase
|
|
31
|
+
from sqlspec.exceptions import SQLSpecError
|
|
32
|
+
from sqlspec.utils.logging import get_logger
|
|
33
|
+
from sqlspec.utils.serializers import from_json
|
|
34
|
+
from sqlspec.utils.type_guards import supports_json_type
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from collections.abc import Callable
|
|
38
|
+
|
|
39
|
+
from sqlspec.adapters.mysqlconnector._typing import MysqlConnectorAsyncConnection, MysqlConnectorSyncConnection
|
|
40
|
+
from sqlspec.core import SQL, StatementConfig
|
|
41
|
+
from sqlspec.driver import ExecutionResult
|
|
42
|
+
from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
|
|
43
|
+
|
|
44
|
+
from sqlspec.adapters.mysqlconnector._typing import MysqlConnectorAsyncSessionContext, MysqlConnectorSyncSessionContext
|
|
45
|
+
|
|
46
|
+
__all__ = (
|
|
47
|
+
"MysqlConnectorAsyncCursor",
|
|
48
|
+
"MysqlConnectorAsyncDriver",
|
|
49
|
+
"MysqlConnectorAsyncExceptionHandler",
|
|
50
|
+
"MysqlConnectorAsyncSessionContext",
|
|
51
|
+
"MysqlConnectorSyncCursor",
|
|
52
|
+
"MysqlConnectorSyncDriver",
|
|
53
|
+
"MysqlConnectorSyncExceptionHandler",
|
|
54
|
+
"MysqlConnectorSyncSessionContext",
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
logger = get_logger("sqlspec.adapters.mysqlconnector")
|
|
58
|
+
|
|
59
|
+
json_type_value = FieldType.JSON if supports_json_type(FieldType) else None
|
|
60
|
+
MYSQLCONNECTOR_JSON_TYPE_CODES: Final[set[int]] = {json_type_value} if json_type_value is not None else set()
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class MysqlConnectorSyncCursor:
|
|
64
|
+
"""Context manager for mysql-connector sync cursor operations."""
|
|
65
|
+
|
|
66
|
+
__slots__ = ("connection", "cursor")
|
|
67
|
+
|
|
68
|
+
def __init__(self, connection: "MysqlConnectorSyncConnection") -> None:
|
|
69
|
+
self.connection = connection
|
|
70
|
+
self.cursor: Any | None = None
|
|
71
|
+
|
|
72
|
+
def __enter__(self) -> Any:
|
|
73
|
+
self.cursor = self.connection.cursor(dictionary=True)
|
|
74
|
+
return self.cursor
|
|
75
|
+
|
|
76
|
+
def __exit__(self, *_: Any) -> None:
|
|
77
|
+
if self.cursor is not None:
|
|
78
|
+
self.cursor.close()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class MysqlConnectorSyncExceptionHandler:
|
|
82
|
+
"""Context manager for handling mysql-connector sync exceptions."""
|
|
83
|
+
|
|
84
|
+
__slots__ = ("pending_exception",)
|
|
85
|
+
|
|
86
|
+
def __init__(self) -> None:
|
|
87
|
+
self.pending_exception: Exception | None = None
|
|
88
|
+
|
|
89
|
+
def __enter__(self) -> "MysqlConnectorSyncExceptionHandler":
|
|
90
|
+
return self
|
|
91
|
+
|
|
92
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
93
|
+
if exc_type is None:
|
|
94
|
+
return False
|
|
95
|
+
if issubclass(exc_type, mysql.connector.Error):
|
|
96
|
+
result = create_mapped_exception(exc_val, logger=logger)
|
|
97
|
+
if result is True:
|
|
98
|
+
return True
|
|
99
|
+
self.pending_exception = cast("Exception", result)
|
|
100
|
+
return True
|
|
101
|
+
return False
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class MysqlConnectorSyncDriver(SyncDriverAdapterBase):
|
|
105
|
+
"""MySQL/MariaDB database driver using mysql-connector sync library."""
|
|
106
|
+
|
|
107
|
+
__slots__ = ("_data_dictionary",)
|
|
108
|
+
dialect = "mysql"
|
|
109
|
+
|
|
110
|
+
def __init__(
|
|
111
|
+
self,
|
|
112
|
+
connection: "MysqlConnectorSyncConnection",
|
|
113
|
+
statement_config: "StatementConfig | None" = None,
|
|
114
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
115
|
+
) -> None:
|
|
116
|
+
if statement_config is None:
|
|
117
|
+
statement_config = default_statement_config.replace(
|
|
118
|
+
enable_caching=get_cache_config().compiled_cache_enabled
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
122
|
+
self._data_dictionary: MysqlConnectorSyncDataDictionary | None = None
|
|
123
|
+
|
|
124
|
+
def dispatch_execute(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
|
|
125
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
126
|
+
cursor.execute(sql, normalize_execute_parameters(prepared_parameters))
|
|
127
|
+
|
|
128
|
+
if statement.returns_rows():
|
|
129
|
+
fetched_data = cursor.fetchall()
|
|
130
|
+
fetched_rows = list(fetched_data) if fetched_data else None
|
|
131
|
+
description = list(cursor.description) if cursor.description else None
|
|
132
|
+
json_indexes = detect_json_columns(cursor, MYSQLCONNECTOR_JSON_TYPE_CODES)
|
|
133
|
+
deserializer = cast("Callable[[Any], Any]", self.driver_features.get("json_deserializer", from_json))
|
|
134
|
+
rows, column_names = collect_rows(fetched_rows, description, json_indexes, deserializer, logger=logger)
|
|
135
|
+
|
|
136
|
+
return self.create_execution_result(
|
|
137
|
+
cursor, selected_data=rows, column_names=column_names, data_row_count=len(rows), is_select_result=True
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
affected_rows = resolve_rowcount(cursor)
|
|
141
|
+
last_id = normalize_lastrowid(cursor)
|
|
142
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows, last_inserted_id=last_id)
|
|
143
|
+
|
|
144
|
+
def dispatch_execute_many(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
|
|
145
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
146
|
+
|
|
147
|
+
prepared_parameters = normalize_execute_many_parameters(prepared_parameters)
|
|
148
|
+
cursor.executemany(sql, prepared_parameters)
|
|
149
|
+
|
|
150
|
+
affected_rows = len(prepared_parameters)
|
|
151
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows, is_many_result=True)
|
|
152
|
+
|
|
153
|
+
def dispatch_execute_script(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
|
|
154
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
155
|
+
statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
|
|
156
|
+
|
|
157
|
+
successful_count = 0
|
|
158
|
+
last_cursor = cursor
|
|
159
|
+
|
|
160
|
+
for stmt in statements:
|
|
161
|
+
cursor.execute(stmt, normalize_execute_parameters(prepared_parameters))
|
|
162
|
+
successful_count += 1
|
|
163
|
+
|
|
164
|
+
return self.create_execution_result(
|
|
165
|
+
last_cursor, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
def begin(self) -> None:
|
|
169
|
+
try:
|
|
170
|
+
with MysqlConnectorSyncCursor(self.connection) as cursor:
|
|
171
|
+
cursor.execute("BEGIN")
|
|
172
|
+
except mysql.connector.Error as e:
|
|
173
|
+
msg = f"Failed to begin MySQL transaction: {e}"
|
|
174
|
+
raise SQLSpecError(msg) from e
|
|
175
|
+
|
|
176
|
+
def commit(self) -> None:
|
|
177
|
+
try:
|
|
178
|
+
self.connection.commit()
|
|
179
|
+
except mysql.connector.Error as e:
|
|
180
|
+
msg = f"Failed to commit MySQL transaction: {e}"
|
|
181
|
+
raise SQLSpecError(msg) from e
|
|
182
|
+
|
|
183
|
+
def rollback(self) -> None:
|
|
184
|
+
try:
|
|
185
|
+
self.connection.rollback()
|
|
186
|
+
except mysql.connector.Error as e:
|
|
187
|
+
msg = f"Failed to rollback MySQL transaction: {e}"
|
|
188
|
+
raise SQLSpecError(msg) from e
|
|
189
|
+
|
|
190
|
+
def with_cursor(self, connection: "MysqlConnectorSyncConnection") -> "MysqlConnectorSyncCursor":
|
|
191
|
+
return MysqlConnectorSyncCursor(connection)
|
|
192
|
+
|
|
193
|
+
def handle_database_exceptions(self) -> "MysqlConnectorSyncExceptionHandler":
|
|
194
|
+
return MysqlConnectorSyncExceptionHandler()
|
|
195
|
+
|
|
196
|
+
def select_to_storage(
|
|
197
|
+
self,
|
|
198
|
+
statement: "SQL | str",
|
|
199
|
+
destination: "StorageDestination",
|
|
200
|
+
/,
|
|
201
|
+
*parameters: Any,
|
|
202
|
+
statement_config: "StatementConfig | None" = None,
|
|
203
|
+
partitioner: "dict[str, object] | None" = None,
|
|
204
|
+
format_hint: "StorageFormat | None" = None,
|
|
205
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
206
|
+
**kwargs: Any,
|
|
207
|
+
) -> "StorageBridgeJob":
|
|
208
|
+
self._require_capability("arrow_export_enabled")
|
|
209
|
+
arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
|
|
210
|
+
pipeline = self._storage_pipeline()
|
|
211
|
+
telemetry_payload = self._write_result_to_storage_sync(
|
|
212
|
+
arrow_result, destination, format_hint=format_hint, pipeline=pipeline
|
|
213
|
+
)
|
|
214
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
215
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
216
|
+
|
|
217
|
+
def load_from_arrow(
|
|
218
|
+
self,
|
|
219
|
+
table: str,
|
|
220
|
+
source: "ArrowResult | Any",
|
|
221
|
+
*,
|
|
222
|
+
partitioner: "dict[str, object] | None" = None,
|
|
223
|
+
overwrite: bool = False,
|
|
224
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
225
|
+
) -> "StorageBridgeJob":
|
|
226
|
+
self._require_capability("arrow_import_enabled")
|
|
227
|
+
arrow_table = self._coerce_arrow_table(source)
|
|
228
|
+
if overwrite:
|
|
229
|
+
statement = f"TRUNCATE TABLE {format_identifier(table)}"
|
|
230
|
+
with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
|
|
231
|
+
cursor.execute(statement)
|
|
232
|
+
|
|
233
|
+
columns, records = self._arrow_table_to_rows(arrow_table)
|
|
234
|
+
if records:
|
|
235
|
+
insert_sql = build_insert_statement(table, columns)
|
|
236
|
+
with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
|
|
237
|
+
cursor.executemany(insert_sql, records)
|
|
238
|
+
|
|
239
|
+
telemetry_payload = self._build_ingest_telemetry(arrow_table)
|
|
240
|
+
telemetry_payload["destination"] = table
|
|
241
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
242
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
243
|
+
|
|
244
|
+
def load_from_storage(
|
|
245
|
+
self,
|
|
246
|
+
table: str,
|
|
247
|
+
source: "StorageDestination",
|
|
248
|
+
*,
|
|
249
|
+
file_format: "StorageFormat",
|
|
250
|
+
partitioner: "dict[str, object] | None" = None,
|
|
251
|
+
overwrite: bool = False,
|
|
252
|
+
) -> "StorageBridgeJob":
|
|
253
|
+
arrow_table, inbound = self._read_arrow_from_storage_sync(source, file_format=file_format)
|
|
254
|
+
return self.load_from_arrow(table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound)
|
|
255
|
+
|
|
256
|
+
@property
|
|
257
|
+
def data_dictionary(self) -> "MysqlConnectorSyncDataDictionary":
|
|
258
|
+
if self._data_dictionary is None:
|
|
259
|
+
self._data_dictionary = MysqlConnectorSyncDataDictionary()
|
|
260
|
+
return self._data_dictionary
|
|
261
|
+
|
|
262
|
+
def _connection_in_transaction(self) -> bool:
|
|
263
|
+
autocommit = getattr(self.connection, "autocommit", None)
|
|
264
|
+
if autocommit is not None:
|
|
265
|
+
try:
|
|
266
|
+
return not bool(autocommit)
|
|
267
|
+
except Exception:
|
|
268
|
+
return False
|
|
269
|
+
return False
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class MysqlConnectorAsyncCursor:
|
|
273
|
+
"""Async context manager for mysql-connector async cursor operations."""
|
|
274
|
+
|
|
275
|
+
__slots__ = ("connection", "cursor")
|
|
276
|
+
|
|
277
|
+
def __init__(self, connection: "MysqlConnectorAsyncConnection") -> None:
|
|
278
|
+
self.connection = connection
|
|
279
|
+
self.cursor: Any | None = None
|
|
280
|
+
|
|
281
|
+
async def __aenter__(self) -> Any:
|
|
282
|
+
self.cursor = await self.connection.cursor(dictionary=True)
|
|
283
|
+
return self.cursor
|
|
284
|
+
|
|
285
|
+
async def __aexit__(self, *_: Any) -> None:
|
|
286
|
+
if self.cursor is not None:
|
|
287
|
+
await self.cursor.close()
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class MysqlConnectorAsyncExceptionHandler:
|
|
291
|
+
"""Async context manager for handling mysql-connector exceptions."""
|
|
292
|
+
|
|
293
|
+
__slots__ = ("pending_exception",)
|
|
294
|
+
|
|
295
|
+
def __init__(self) -> None:
|
|
296
|
+
self.pending_exception: Exception | None = None
|
|
297
|
+
|
|
298
|
+
async def __aenter__(self) -> "MysqlConnectorAsyncExceptionHandler":
|
|
299
|
+
return self
|
|
300
|
+
|
|
301
|
+
async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
302
|
+
if exc_type is None:
|
|
303
|
+
return False
|
|
304
|
+
if issubclass(exc_type, mysql.connector.Error):
|
|
305
|
+
result = create_mapped_exception(exc_val, logger=logger)
|
|
306
|
+
if result is True:
|
|
307
|
+
return True
|
|
308
|
+
self.pending_exception = cast("Exception", result)
|
|
309
|
+
return True
|
|
310
|
+
return False
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
class MysqlConnectorAsyncDriver(AsyncDriverAdapterBase):
|
|
314
|
+
"""MySQL/MariaDB database driver using mysql-connector async library."""
|
|
315
|
+
|
|
316
|
+
__slots__ = ("_data_dictionary",)
|
|
317
|
+
dialect = "mysql"
|
|
318
|
+
|
|
319
|
+
def __init__(
|
|
320
|
+
self,
|
|
321
|
+
connection: "MysqlConnectorAsyncConnection",
|
|
322
|
+
statement_config: "StatementConfig | None" = None,
|
|
323
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
324
|
+
) -> None:
|
|
325
|
+
if statement_config is None:
|
|
326
|
+
statement_config = default_statement_config.replace(
|
|
327
|
+
enable_caching=get_cache_config().compiled_cache_enabled
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
331
|
+
self._data_dictionary: MysqlConnectorAsyncDataDictionary | None = None
|
|
332
|
+
|
|
333
|
+
async def dispatch_execute(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
|
|
334
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
335
|
+
await cursor.execute(sql, normalize_execute_parameters(prepared_parameters))
|
|
336
|
+
|
|
337
|
+
if statement.returns_rows():
|
|
338
|
+
fetched_data = await cursor.fetchall()
|
|
339
|
+
fetched_rows = list(fetched_data) if fetched_data else None
|
|
340
|
+
description = list(cursor.description) if cursor.description else None
|
|
341
|
+
json_indexes = detect_json_columns(cursor, MYSQLCONNECTOR_JSON_TYPE_CODES)
|
|
342
|
+
deserializer = cast("Callable[[Any], Any]", self.driver_features.get("json_deserializer", from_json))
|
|
343
|
+
rows, column_names = collect_rows(fetched_rows, description, json_indexes, deserializer, logger=logger)
|
|
344
|
+
|
|
345
|
+
return self.create_execution_result(
|
|
346
|
+
cursor, selected_data=rows, column_names=column_names, data_row_count=len(rows), is_select_result=True
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
affected_rows = resolve_rowcount(cursor)
|
|
350
|
+
last_id = normalize_lastrowid(cursor)
|
|
351
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows, last_inserted_id=last_id)
|
|
352
|
+
|
|
353
|
+
async def dispatch_execute_many(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
|
|
354
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
355
|
+
|
|
356
|
+
prepared_parameters = normalize_execute_many_parameters(prepared_parameters)
|
|
357
|
+
await cursor.executemany(sql, prepared_parameters)
|
|
358
|
+
|
|
359
|
+
affected_rows = len(prepared_parameters)
|
|
360
|
+
return self.create_execution_result(cursor, rowcount_override=affected_rows, is_many_result=True)
|
|
361
|
+
|
|
362
|
+
async def dispatch_execute_script(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
|
|
363
|
+
sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
|
|
364
|
+
statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
|
|
365
|
+
|
|
366
|
+
successful_count = 0
|
|
367
|
+
last_cursor = cursor
|
|
368
|
+
|
|
369
|
+
for stmt in statements:
|
|
370
|
+
await cursor.execute(stmt, normalize_execute_parameters(prepared_parameters))
|
|
371
|
+
successful_count += 1
|
|
372
|
+
|
|
373
|
+
return self.create_execution_result(
|
|
374
|
+
last_cursor, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
async def begin(self) -> None:
|
|
378
|
+
try:
|
|
379
|
+
async with MysqlConnectorAsyncCursor(self.connection) as cursor:
|
|
380
|
+
await cursor.execute("BEGIN")
|
|
381
|
+
except mysql.connector.Error as e:
|
|
382
|
+
msg = f"Failed to begin MySQL transaction: {e}"
|
|
383
|
+
raise SQLSpecError(msg) from e
|
|
384
|
+
|
|
385
|
+
async def commit(self) -> None:
|
|
386
|
+
try:
|
|
387
|
+
await self.connection.commit()
|
|
388
|
+
except mysql.connector.Error as e:
|
|
389
|
+
msg = f"Failed to commit MySQL transaction: {e}"
|
|
390
|
+
raise SQLSpecError(msg) from e
|
|
391
|
+
|
|
392
|
+
async def rollback(self) -> None:
|
|
393
|
+
try:
|
|
394
|
+
await self.connection.rollback()
|
|
395
|
+
except mysql.connector.Error as e:
|
|
396
|
+
msg = f"Failed to rollback MySQL transaction: {e}"
|
|
397
|
+
raise SQLSpecError(msg) from e
|
|
398
|
+
|
|
399
|
+
def with_cursor(self, connection: "MysqlConnectorAsyncConnection") -> "MysqlConnectorAsyncCursor":
|
|
400
|
+
return MysqlConnectorAsyncCursor(connection)
|
|
401
|
+
|
|
402
|
+
def handle_database_exceptions(self) -> "MysqlConnectorAsyncExceptionHandler":
|
|
403
|
+
return MysqlConnectorAsyncExceptionHandler()
|
|
404
|
+
|
|
405
|
+
async def select_to_storage(
|
|
406
|
+
self,
|
|
407
|
+
statement: "SQL | str",
|
|
408
|
+
destination: "StorageDestination",
|
|
409
|
+
/,
|
|
410
|
+
*parameters: Any,
|
|
411
|
+
statement_config: "StatementConfig | None" = None,
|
|
412
|
+
partitioner: "dict[str, object] | None" = None,
|
|
413
|
+
format_hint: "StorageFormat | None" = None,
|
|
414
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
415
|
+
**kwargs: Any,
|
|
416
|
+
) -> "StorageBridgeJob":
|
|
417
|
+
self._require_capability("arrow_export_enabled")
|
|
418
|
+
arrow_result = await self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
|
|
419
|
+
async_pipeline = self._storage_pipeline()
|
|
420
|
+
telemetry_payload = await self._write_result_to_storage_async(
|
|
421
|
+
arrow_result, destination, format_hint=format_hint, pipeline=async_pipeline
|
|
422
|
+
)
|
|
423
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
424
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
425
|
+
|
|
426
|
+
async def load_from_arrow(
|
|
427
|
+
self,
|
|
428
|
+
table: str,
|
|
429
|
+
source: "ArrowResult | Any",
|
|
430
|
+
*,
|
|
431
|
+
partitioner: "dict[str, object] | None" = None,
|
|
432
|
+
overwrite: bool = False,
|
|
433
|
+
telemetry: "StorageTelemetry | None" = None,
|
|
434
|
+
) -> "StorageBridgeJob":
|
|
435
|
+
self._require_capability("arrow_import_enabled")
|
|
436
|
+
arrow_table = self._coerce_arrow_table(source)
|
|
437
|
+
if overwrite:
|
|
438
|
+
statement = f"TRUNCATE TABLE {format_identifier(table)}"
|
|
439
|
+
async with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
|
|
440
|
+
await cursor.execute(statement)
|
|
441
|
+
|
|
442
|
+
columns, records = self._arrow_table_to_rows(arrow_table)
|
|
443
|
+
if records:
|
|
444
|
+
insert_sql = build_insert_statement(table, columns)
|
|
445
|
+
async with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
|
|
446
|
+
await cursor.executemany(insert_sql, records)
|
|
447
|
+
|
|
448
|
+
telemetry_payload = self._build_ingest_telemetry(arrow_table)
|
|
449
|
+
telemetry_payload["destination"] = table
|
|
450
|
+
self._attach_partition_telemetry(telemetry_payload, partitioner)
|
|
451
|
+
return self._create_storage_job(telemetry_payload, telemetry)
|
|
452
|
+
|
|
453
|
+
async def load_from_storage(
|
|
454
|
+
self,
|
|
455
|
+
table: str,
|
|
456
|
+
source: "StorageDestination",
|
|
457
|
+
*,
|
|
458
|
+
file_format: "StorageFormat",
|
|
459
|
+
partitioner: "dict[str, object] | None" = None,
|
|
460
|
+
overwrite: bool = False,
|
|
461
|
+
) -> "StorageBridgeJob":
|
|
462
|
+
arrow_table, inbound = await self._read_arrow_from_storage_async(source, file_format=file_format)
|
|
463
|
+
return await self.load_from_arrow(
|
|
464
|
+
table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
@property
|
|
468
|
+
def data_dictionary(self) -> "MysqlConnectorAsyncDataDictionary":
|
|
469
|
+
if self._data_dictionary is None:
|
|
470
|
+
self._data_dictionary = MysqlConnectorAsyncDataDictionary()
|
|
471
|
+
return self._data_dictionary
|
|
472
|
+
|
|
473
|
+
def _connection_in_transaction(self) -> bool:
|
|
474
|
+
in_tx = getattr(self.connection, "in_transaction", None)
|
|
475
|
+
if in_tx is not None:
|
|
476
|
+
try:
|
|
477
|
+
return bool(in_tx)
|
|
478
|
+
except Exception:
|
|
479
|
+
return False
|
|
480
|
+
return False
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
register_driver_profile("mysql-connector", driver_profile)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""Events helpers for the MysqlConnector adapter."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.adapters.mysqlconnector.events.store import (
|
|
4
|
+
MysqlConnectorAsyncEventQueueStore,
|
|
5
|
+
MysqlConnectorSyncEventQueueStore,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
__all__ = ("MysqlConnectorAsyncEventQueueStore", "MysqlConnectorSyncEventQueueStore")
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""MysqlConnector event queue store with MySQL-specific DDL."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Final
|
|
4
|
+
|
|
5
|
+
from sqlspec.adapters.mysqlconnector.config import MysqlConnectorAsyncConfig, MysqlConnectorSyncConfig
|
|
6
|
+
from sqlspec.extensions.events import BaseEventQueueStore
|
|
7
|
+
|
|
8
|
+
__all__ = ("MysqlConnectorAsyncEventQueueStore", "MysqlConnectorSyncEventQueueStore")
|
|
9
|
+
|
|
10
|
+
SCHEMA_QUALIFIED_SEGMENTS: Final[int] = 2
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _mysql_column_types() -> "tuple[str, str, str]":
|
|
14
|
+
"""Return MySQL-specific column types for the event queue."""
|
|
15
|
+
return "JSON", "JSON", "DATETIME(6)"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _mysql_timestamp_default() -> str:
|
|
19
|
+
"""Return MySQL-specific timestamp default."""
|
|
20
|
+
return "CURRENT_TIMESTAMP(6)"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _mysql_build_index_sql(store: Any) -> str | None:
|
|
24
|
+
"""Build MySQL-specific index SQL that checks for existing indexes.
|
|
25
|
+
|
|
26
|
+
MySQL doesn't support CREATE INDEX IF NOT EXISTS, so we use a workaround
|
|
27
|
+
with information_schema to check if the index already exists.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
store: Event queue store instance with table_name and _index_name().
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
MySQL-specific index creation SQL using prepared statements.
|
|
34
|
+
"""
|
|
35
|
+
table_name: str = store.table_name
|
|
36
|
+
segments = table_name.split(".", 1)
|
|
37
|
+
|
|
38
|
+
if len(segments) == SCHEMA_QUALIFIED_SEGMENTS:
|
|
39
|
+
schema = segments[0]
|
|
40
|
+
table = segments[1]
|
|
41
|
+
schema_selector = f"'{schema}'"
|
|
42
|
+
else:
|
|
43
|
+
table = segments[0]
|
|
44
|
+
schema_selector = "DATABASE()"
|
|
45
|
+
|
|
46
|
+
index_name: str = store._index_name()
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
"SET @sqlspec_events_idx_exists := ("
|
|
50
|
+
"SELECT COUNT(1) FROM information_schema.statistics "
|
|
51
|
+
f"WHERE table_schema = {schema_selector} "
|
|
52
|
+
f"AND table_name = '{table}' "
|
|
53
|
+
f"AND index_name = '{index_name}');"
|
|
54
|
+
"SET @sqlspec_events_idx_stmt := IF(@sqlspec_events_idx_exists = 0, "
|
|
55
|
+
f"'ALTER TABLE {table_name} ADD INDEX {index_name} (channel, status, available_at)', "
|
|
56
|
+
"'SELECT 1');"
|
|
57
|
+
"PREPARE sqlspec_events_stmt FROM @sqlspec_events_idx_stmt;"
|
|
58
|
+
"EXECUTE sqlspec_events_stmt;"
|
|
59
|
+
"DEALLOCATE PREPARE sqlspec_events_stmt;"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class MysqlConnectorSyncEventQueueStore(BaseEventQueueStore[MysqlConnectorSyncConfig]):
|
|
64
|
+
"""Queue DDL for mysql-connector synchronous configs.
|
|
65
|
+
|
|
66
|
+
MySQL uses JSON for efficient JSON storage and DATETIME(6) for
|
|
67
|
+
microsecond precision timestamps.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
__slots__ = ()
|
|
71
|
+
|
|
72
|
+
def _column_types(self) -> "tuple[str, str, str]":
|
|
73
|
+
return _mysql_column_types()
|
|
74
|
+
|
|
75
|
+
def _timestamp_default(self) -> str:
|
|
76
|
+
return _mysql_timestamp_default()
|
|
77
|
+
|
|
78
|
+
def _build_index_sql(self) -> str | None:
|
|
79
|
+
return _mysql_build_index_sql(self)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class MysqlConnectorAsyncEventQueueStore(BaseEventQueueStore[MysqlConnectorAsyncConfig]):
|
|
83
|
+
"""Queue DDL for mysql-connector async configs.
|
|
84
|
+
|
|
85
|
+
MySQL uses JSON for efficient JSON storage and DATETIME(6) for
|
|
86
|
+
microsecond precision timestamps.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
__slots__ = ()
|
|
90
|
+
|
|
91
|
+
def _column_types(self) -> "tuple[str, str, str]":
|
|
92
|
+
return _mysql_column_types()
|
|
93
|
+
|
|
94
|
+
def _timestamp_default(self) -> str:
|
|
95
|
+
return _mysql_timestamp_default()
|
|
96
|
+
|
|
97
|
+
def _build_index_sql(self) -> str | None:
|
|
98
|
+
return _mysql_build_index_sql(self)
|