dblift 2.2.2__tar.gz → 2.4.0__tar.gz
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.
- {dblift-2.2.2 → dblift-2.4.0}/PKG-INFO +19 -2
- {dblift-2.2.2 → dblift-2.4.0}/cli/main.py +40 -10
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/repair_command.py +17 -1
- dblift-2.4.0/db/plugins/alloydb/__init__.py +12 -0
- dblift-2.4.0/db/plugins/alloydb/plugin.py +28 -0
- dblift-2.4.0/db/plugins/alloydb/provider.py +14 -0
- dblift-2.4.0/db/plugins/alloydb/quirks.py +32 -0
- dblift-2.4.0/db/plugins/aurora_postgresql/__init__.py +12 -0
- dblift-2.4.0/db/plugins/aurora_postgresql/plugin.py +28 -0
- dblift-2.4.0/db/plugins/aurora_postgresql/provider.py +14 -0
- dblift-2.4.0/db/plugins/aurora_postgresql/quirks.py +32 -0
- dblift-2.4.0/db/plugins/citus/__init__.py +12 -0
- dblift-2.4.0/db/plugins/citus/plugin.py +28 -0
- dblift-2.4.0/db/plugins/citus/provider.py +14 -0
- dblift-2.4.0/db/plugins/citus/quirks.py +32 -0
- dblift-2.4.0/db/plugins/duckdb/__init__.py +12 -0
- dblift-2.4.0/db/plugins/duckdb/config.py +81 -0
- dblift-2.4.0/db/plugins/duckdb/parser/__init__.py +5 -0
- dblift-2.4.0/db/plugins/duckdb/parser/duckdb_regex_parser.py +180 -0
- dblift-2.4.0/db/plugins/duckdb/parser/parser_config.py +203 -0
- dblift-2.4.0/db/plugins/duckdb/plugin.py +22 -0
- dblift-2.4.0/db/plugins/duckdb/provider.py +368 -0
- dblift-2.4.0/db/plugins/duckdb/quirks.py +96 -0
- dblift-2.4.0/db/plugins/duckdb/sqlalchemy_url.py +30 -0
- dblift-2.4.0/db/plugins/neon/__init__.py +12 -0
- dblift-2.4.0/db/plugins/neon/plugin.py +28 -0
- dblift-2.4.0/db/plugins/neon/provider.py +14 -0
- dblift-2.4.0/db/plugins/neon/quirks.py +32 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/config.py +20 -1
- dblift-2.4.0/db/plugins/supabase/__init__.py +12 -0
- dblift-2.4.0/db/plugins/supabase/plugin.py +28 -0
- dblift-2.4.0/db/plugins/supabase/provider.py +14 -0
- dblift-2.4.0/db/plugins/supabase/quirks.py +32 -0
- dblift-2.4.0/db/plugins/timescaledb/__init__.py +12 -0
- dblift-2.4.0/db/plugins/timescaledb/plugin.py +28 -0
- dblift-2.4.0/db/plugins/timescaledb/provider.py +14 -0
- dblift-2.4.0/db/plugins/timescaledb/quirks.py +32 -0
- dblift-2.4.0/db/plugins/yugabytedb/__init__.py +12 -0
- dblift-2.4.0/db/plugins/yugabytedb/plugin.py +28 -0
- dblift-2.4.0/db/plugins/yugabytedb/provider.py +14 -0
- dblift-2.4.0/db/plugins/yugabytedb/quirks.py +32 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/sqlalchemy_provider.py +6 -0
- {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/PKG-INFO +19 -2
- {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/SOURCES.txt +37 -0
- {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/entry_points.txt +8 -0
- {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/requires.txt +26 -1
- {dblift-2.2.2 → dblift-2.4.0}/pyproject.toml +67 -2
- {dblift-2.2.2 → dblift-2.4.0}/LICENSE +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/README.md +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/_cli_support.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/_client_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/_client_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/_engine_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/async_client.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/client.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/events.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/migrations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/api/py.typed +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/_command_handlers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/_config_helpers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/_constants.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/_output.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/_parser_setup.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/commands/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/commands/config_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/db_utils.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/extensions.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/_shared.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/baseline.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/clean.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/import_flyway.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/info.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/migrate.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/repair.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/undo.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/validate.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/_credential_masking.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/_subclasses/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/_subclasses/dummy_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/_url_builder_mixin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/config_builder.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/database_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/dblift_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/errors.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/property_registry.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/secrets/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_cache.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_provider_base.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_registry.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_resolver.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_secrets_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/constants.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/dialect_boundary.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/exceptions.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_column_enricher.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_partition_enricher.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_schema_orchestrator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_utils.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_vendor_property_applier.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/base_introspector.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/base_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/column_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/constraint_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/index_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/misc_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/procedure_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/sequence_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/table_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/trigger_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/view_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/introspector_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/result.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/schema_introspector.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/vendor_queries_base.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/vendor_queries_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/vendor_queries_protocols.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/introspection/version_detector.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/_base.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/_formatters.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/_levels.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/_multi.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/_null.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/console.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/_formatter_impl.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/formatter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/htmlformatter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/jsonformatter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/log.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/results.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/templates/oldreport.html +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/logger/templates/report.html +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/_type_match.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/clean_summary.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/_script_events.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/base_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/baseline_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/clean_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/import_flyway_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/info_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/migrate_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/undo_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/validate_command.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/encoding.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/execution_engine.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/migration_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/migration_helpers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/placeholder_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/transaction_policy.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/base_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/executor_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/python_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/sql_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/formats/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/formats/format_detector.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/formats/migration_format.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/history/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/history/migration_history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/journals/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/journals/migration_journal.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/migration.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/placeholders/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/placeholders/placeholder_service.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/rules/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/rules/migration_rules.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/migration_script_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_ddl_reversers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_dml_reversers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_extractors.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_generator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_helpers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_models.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_reversers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/execution_statement.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/sql_analyzer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/sql_execution_service.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/statement_splitter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_data_service.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_display_state.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_formatter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_state.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_state_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_state_service.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/data_collector.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/display_formatters.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/migration_analyzer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/migration_ui.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/table_renderer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/migration/version_utils.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/dependency_resolver.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/identifier_normalizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/object_orderer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_constants.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_mapper.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_mappings.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_normalizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/capabilities.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/event_listeners.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/feature_loading.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/introspection.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/license_info.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/runtime_checks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/sql_generators.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/seams/tier_resolver.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter/alter_generator_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter/base_alter_generator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter_generator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/base_generator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/basic_table_ddl_generator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/dependency_analyzer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/diff_converters/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/diff_converters/base_converter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/formatter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/generator_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/options.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/script_organizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/sql_generator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/sql_statement.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/table_ddl_render.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_parse_result.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_column.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_constraint.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_object.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_statement.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/base.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/constraint_validator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/database_link.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/dialect.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/event.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/extension.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/foreign_data_wrapper.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/foreign_server.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/index.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/linked_server.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/module.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/package.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/partition.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/procedure.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/sequence.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/synonym.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/table.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/table_canonicalizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/table_options.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/trigger.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/user_defined_type.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/view.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/view_options.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/_partition_handler.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/_sqlglot_builders.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/base_statement_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/base_tokenizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/common/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/common/base_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/dialects/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/dialects/base_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/enhanced_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/hybrid_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/parser_context.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/parser_factory.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/parser_interface.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/sqlglot_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/tokens.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/unified_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_checksum_validator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_flyway_compatibility.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_migration_filter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_sql_syntax_validator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_strict_mode_validator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/migration_validator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/state/sql_script_formatter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/state/sql_statement.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/utils/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/utils/database_url_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/utils/metadata_helpers.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/utils/row_access.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/utils/string_utils.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/core/utils/url_masking.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/base_provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/base_quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/constants.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/dml_analysis.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/error.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/error_handler.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/exceptions.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/native_connection_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/object_naming.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_query_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_snapshot_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_undo_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/_sdk.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/connection_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/query_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/parser/cosmosdb_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_executors.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_parsing.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_script_generation.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_translator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_translators.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/parser/db2_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/parser/parser_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/sqlalchemy_url.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/mysql_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/mysql_statement_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/mysql_tokenizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/parser_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/sqlalchemy_url.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/introspection/oracle_utils.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/dbms_output.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_comments.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_object_extractor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_plsql_block.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_sqlplus.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_statement_splitter.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/oracle_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/oracle_statement_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/oracle_tokenizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/parser_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/sqlplus_context.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/sqlalchemy_url.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/_provider_query_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/parser_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/postgresql_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/postgresql_statement_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/postgresql_tokenizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/sqlalchemy_url.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/parser/parser_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/parser/sqlite_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlalchemy_url.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/connection_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/query_executor.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/introspection/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/parser_config.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/sqlserver_regex_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/sqlserver_statement_parser.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/sqlserver_tokenizer.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/tsql_batch_separator.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/plugin.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/provider.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/quirks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlalchemy_url.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/history_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/locking_manager.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/schema_operations.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/provider_capabilities.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/provider_interfaces.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/provider_registry.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/db/value_utils.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/dependency_links.txt +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/top_level.txt +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/_client.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/_engine.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/apps.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/checks.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/__init__.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/dblift_info.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/dblift_migrate.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/dblift_validate.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/fastapi.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/flask.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/integrations/opentelemetry.py +0 -0
- {dblift-2.2.2 → dblift-2.4.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dblift
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Summary: A database migration tool that supports multiple databases with native Python drivers
|
|
5
5
|
Classifier: Development Status :: 5 - Production/Stable
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -66,6 +66,23 @@ Requires-Dist: pymssql>=2.3; extra == "sqlserver"
|
|
|
66
66
|
Provides-Extra: db2
|
|
67
67
|
Requires-Dist: ibm_db>=3.2; extra == "db2"
|
|
68
68
|
Requires-Dist: ibm_db_sa>=0.4; extra == "db2"
|
|
69
|
+
Provides-Extra: duckdb
|
|
70
|
+
Requires-Dist: duckdb>=1.0; extra == "duckdb"
|
|
71
|
+
Requires-Dist: duckdb_engine>=0.13; extra == "duckdb"
|
|
72
|
+
Provides-Extra: neon
|
|
73
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "neon"
|
|
74
|
+
Provides-Extra: supabase
|
|
75
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "supabase"
|
|
76
|
+
Provides-Extra: aurora-postgresql
|
|
77
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "aurora-postgresql"
|
|
78
|
+
Provides-Extra: alloydb
|
|
79
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "alloydb"
|
|
80
|
+
Provides-Extra: yugabytedb
|
|
81
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "yugabytedb"
|
|
82
|
+
Provides-Extra: timescaledb
|
|
83
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "timescaledb"
|
|
84
|
+
Provides-Extra: citus
|
|
85
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "citus"
|
|
69
86
|
Provides-Extra: fastapi
|
|
70
87
|
Requires-Dist: fastapi>=0.100; extra == "fastapi"
|
|
71
88
|
Provides-Extra: flask
|
|
@@ -75,7 +92,7 @@ Requires-Dist: Django>=4.2; extra == "django"
|
|
|
75
92
|
Provides-Extra: otel
|
|
76
93
|
Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
|
|
77
94
|
Provides-Extra: all
|
|
78
|
-
Requires-Dist: dblift[db2,mariadb,mysql,oracle,postgresql,sqlserver]; extra == "all"
|
|
95
|
+
Requires-Dist: dblift[db2,duckdb,mariadb,mysql,oracle,postgresql,sqlserver]; extra == "all"
|
|
79
96
|
Dynamic: license-file
|
|
80
97
|
|
|
81
98
|
# DBLift — Database release safety for Python teams
|
|
@@ -145,6 +145,44 @@ class _CliContext:
|
|
|
145
145
|
license_info: Optional[Any] = None
|
|
146
146
|
|
|
147
147
|
|
|
148
|
+
def _format_version() -> str:
|
|
149
|
+
"""Render the ``--version`` output.
|
|
150
|
+
|
|
151
|
+
The published ``dblift`` wheel is the OSS *core*. The paid tiers ship as
|
|
152
|
+
separate distributions (``dblift-pro`` / ``dblift-enterprise``) bundled into
|
|
153
|
+
the compiled binary, each on its own release lifecycle — so their versions
|
|
154
|
+
need not match the core's. Report the most-derived installed tier as the
|
|
155
|
+
headline (that is the product the user actually runs) and, when a paid tier
|
|
156
|
+
is present, list every component so a bare number is never ambiguous. In a
|
|
157
|
+
plain OSS install only the core is present, so the output stays a single
|
|
158
|
+
``dblift version X`` line — unchanged from before.
|
|
159
|
+
"""
|
|
160
|
+
from importlib.metadata import PackageNotFoundError
|
|
161
|
+
from importlib.metadata import version as _version
|
|
162
|
+
|
|
163
|
+
def _get(dist: str) -> Optional[str]:
|
|
164
|
+
try:
|
|
165
|
+
return _version(dist)
|
|
166
|
+
except PackageNotFoundError:
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
core = _get("dblift")
|
|
170
|
+
pro = _get("dblift-pro")
|
|
171
|
+
enterprise = _get("dblift-enterprise")
|
|
172
|
+
|
|
173
|
+
# Headline = most-derived installed tier (the product actually running).
|
|
174
|
+
product = enterprise or pro or core
|
|
175
|
+
lines = [f"dblift version {product}"]
|
|
176
|
+
# Component manifest only when a paid tier is present; OSS stays one line.
|
|
177
|
+
if pro or enterprise:
|
|
178
|
+
lines.append(f" core (OSS): {core}")
|
|
179
|
+
if pro:
|
|
180
|
+
lines.append(f" pro: {pro}")
|
|
181
|
+
if enterprise:
|
|
182
|
+
lines.append(f" enterprise: {enterprise}")
|
|
183
|
+
return "\n".join(lines)
|
|
184
|
+
|
|
185
|
+
|
|
148
186
|
def main() -> None:
|
|
149
187
|
"""Main entry point for DBLift CLI application.
|
|
150
188
|
|
|
@@ -211,22 +249,14 @@ def _parse_argv_and_load_config(argv: List[str]) -> _CliContext:
|
|
|
211
249
|
if commands and commands[0] in terminal_commands:
|
|
212
250
|
args = _build_terminal_args(commands[0], global_arguments, subcommand_args)
|
|
213
251
|
if hasattr(args, "version") and args.version:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
__version__ = _version("dblift")
|
|
217
|
-
|
|
218
|
-
print(f"dblift version {__version__}") # lint: allow-print --version terminal action
|
|
252
|
+
print(_format_version()) # lint: allow-print --version terminal action
|
|
219
253
|
sys.exit(0)
|
|
220
254
|
sys.exit(terminal_commands[commands[0]](args))
|
|
221
255
|
|
|
222
256
|
args, _unknown_args = _build_args_namespace(commands, global_arguments, subcommand_args)
|
|
223
257
|
|
|
224
258
|
if hasattr(args, "version") and args.version:
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
__version__ = _version("dblift")
|
|
228
|
-
|
|
229
|
-
print(f"dblift version {__version__}") # lint: allow-print --version terminal action
|
|
259
|
+
print(_format_version()) # lint: allow-print --version terminal action
|
|
230
260
|
sys.exit(0)
|
|
231
261
|
|
|
232
262
|
if not commands and (not hasattr(args, "command") or not args.command):
|
|
@@ -498,7 +498,23 @@ class RepairCommand(BaseCommand):
|
|
|
498
498
|
params=[script_name],
|
|
499
499
|
)
|
|
500
500
|
|
|
501
|
-
|
|
501
|
+
row_removed = rows_affected > 0
|
|
502
|
+
if (
|
|
503
|
+
rows_affected < 0
|
|
504
|
+
and not is_non_transactional
|
|
505
|
+
and hasattr(self.provider, "execute_query")
|
|
506
|
+
):
|
|
507
|
+
# Some DBAPIs report an "unknown" rowcount of -1 for DML
|
|
508
|
+
# (e.g. duckdb_engine), so ``rows_affected > 0`` would wrongly
|
|
509
|
+
# read as "nothing removed". Verify the failed row is gone.
|
|
510
|
+
remaining = self.provider.execute_query(
|
|
511
|
+
f"SELECT 1 FROM {qualified_table} "
|
|
512
|
+
f"WHERE script = ? AND success = {false_literal}",
|
|
513
|
+
[script_name],
|
|
514
|
+
)
|
|
515
|
+
row_removed = not remaining
|
|
516
|
+
|
|
517
|
+
if row_removed:
|
|
502
518
|
result.failed_migrations_removed = (
|
|
503
519
|
getattr(result, "failed_migrations_removed", 0) + 1
|
|
504
520
|
)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Google AlloyDB for PostgreSQL database provider plugin (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "alloydb"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "Google AlloyDB for PostgreSQL database provider"
|
|
6
|
+
__plugin_dialects__ = ["alloydb"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "AlloydbProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import AlloydbProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["AlloydbProvider"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Entry-point declaration for the Google AlloyDB for PostgreSQL plugin.
|
|
2
|
+
|
|
3
|
+
Google AlloyDB for PostgreSQL is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
|
|
4
|
+
config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
|
|
5
|
+
``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
|
|
6
|
+
keep their ``postgresql://`` connection string and select this engine via
|
|
7
|
+
``type: alloydb``.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from db.plugins.alloydb.provider import AlloydbProvider
|
|
13
|
+
from db.plugins.alloydb.quirks import AlloydbQuirks
|
|
14
|
+
from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
|
|
15
|
+
from db.provider_registry import PluginInfo
|
|
16
|
+
|
|
17
|
+
PLUGIN: PluginInfo = PluginInfo(
|
|
18
|
+
name="alloydb",
|
|
19
|
+
version="1.0.0",
|
|
20
|
+
description="Google AlloyDB for PostgreSQL database provider",
|
|
21
|
+
dialects=["alloydb"],
|
|
22
|
+
provider_class=AlloydbProvider,
|
|
23
|
+
transport="native",
|
|
24
|
+
quirks_class=AlloydbQuirks,
|
|
25
|
+
config_dialect="postgresql", # Google AlloyDB for PostgreSQL shares PostgreSQL's config class
|
|
26
|
+
sqlalchemy_url_builder=build_sqlalchemy_url,
|
|
27
|
+
native_driver_module="psycopg",
|
|
28
|
+
)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Google AlloyDB for PostgreSQL native provider (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.provider import PostgreSqlProvider
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AlloydbProvider(PostgreSqlProvider):
|
|
9
|
+
"""Google AlloyDB for PostgreSQL — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
|
|
10
|
+
|
|
11
|
+
canonical_dialect_key = "alloydb"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["AlloydbProvider"]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Google AlloyDB for PostgreSQL :class:`DialectQuirks` — inherits PostgreSQL behavior."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.quirks import PostgresqlQuirks
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AlloydbQuirks(PostgresqlQuirks):
|
|
9
|
+
"""Google AlloyDB for PostgreSQL quirks, inheriting every PostgreSQL quirk.
|
|
10
|
+
|
|
11
|
+
Google AlloyDB for PostgreSQL speaks the PostgreSQL wire protocol, so statement splitting,
|
|
12
|
+
rendering, comparison, and introspection all reuse PostgreSQL's behavior.
|
|
13
|
+
Only the ANSI-reference flag is overridden: exactly one registered plugin
|
|
14
|
+
(PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
|
|
15
|
+
must not re-claim it. Engine-specific deviations land here if and when the
|
|
16
|
+
codebase needs them.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
# Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
|
|
20
|
+
# PG-derived plugin that inherited ``True`` would break
|
|
21
|
+
# ``ProviderRegistry.reference_dialect_name`` (which requires a single
|
|
22
|
+
# winner), so reset it here.
|
|
23
|
+
is_ansi_reference_dialect = False
|
|
24
|
+
# PostgreSQL is likewise the single owner of the sqlglot read-dialect
|
|
25
|
+
# fallback; a PG-derived plugin must not claim it either.
|
|
26
|
+
is_default_sqlglot_read_fallback = False
|
|
27
|
+
|
|
28
|
+
def __init__(self, dialect_name: str = "alloydb") -> None:
|
|
29
|
+
super().__init__(dialect_name=dialect_name)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
__all__ = ["AlloydbQuirks"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Amazon Aurora PostgreSQL database provider plugin (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "aurora-postgresql"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "Amazon Aurora PostgreSQL database provider"
|
|
6
|
+
__plugin_dialects__ = ["aurora-postgresql"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "AuroraPostgresqlProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import AuroraPostgresqlProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["AuroraPostgresqlProvider"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Entry-point declaration for the Amazon Aurora PostgreSQL plugin.
|
|
2
|
+
|
|
3
|
+
Amazon Aurora PostgreSQL is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
|
|
4
|
+
config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
|
|
5
|
+
``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
|
|
6
|
+
keep their ``postgresql://`` connection string and select this engine via
|
|
7
|
+
``type: aurora-postgresql``.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from db.plugins.aurora_postgresql.provider import AuroraPostgresqlProvider
|
|
13
|
+
from db.plugins.aurora_postgresql.quirks import AuroraPostgresqlQuirks
|
|
14
|
+
from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
|
|
15
|
+
from db.provider_registry import PluginInfo
|
|
16
|
+
|
|
17
|
+
PLUGIN: PluginInfo = PluginInfo(
|
|
18
|
+
name="aurora-postgresql",
|
|
19
|
+
version="1.0.0",
|
|
20
|
+
description="Amazon Aurora PostgreSQL database provider",
|
|
21
|
+
dialects=["aurora-postgresql"],
|
|
22
|
+
provider_class=AuroraPostgresqlProvider,
|
|
23
|
+
transport="native",
|
|
24
|
+
quirks_class=AuroraPostgresqlQuirks,
|
|
25
|
+
config_dialect="postgresql", # Amazon Aurora PostgreSQL shares PostgreSQL's config class
|
|
26
|
+
sqlalchemy_url_builder=build_sqlalchemy_url,
|
|
27
|
+
native_driver_module="psycopg",
|
|
28
|
+
)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Amazon Aurora PostgreSQL native provider (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.provider import PostgreSqlProvider
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AuroraPostgresqlProvider(PostgreSqlProvider):
|
|
9
|
+
"""Amazon Aurora PostgreSQL — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
|
|
10
|
+
|
|
11
|
+
canonical_dialect_key = "aurora-postgresql"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["AuroraPostgresqlProvider"]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Amazon Aurora PostgreSQL :class:`DialectQuirks` — inherits PostgreSQL behavior."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.quirks import PostgresqlQuirks
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AuroraPostgresqlQuirks(PostgresqlQuirks):
|
|
9
|
+
"""Amazon Aurora PostgreSQL quirks, inheriting every PostgreSQL quirk.
|
|
10
|
+
|
|
11
|
+
Amazon Aurora PostgreSQL speaks the PostgreSQL wire protocol, so statement splitting,
|
|
12
|
+
rendering, comparison, and introspection all reuse PostgreSQL's behavior.
|
|
13
|
+
Only the ANSI-reference flag is overridden: exactly one registered plugin
|
|
14
|
+
(PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
|
|
15
|
+
must not re-claim it. Engine-specific deviations land here if and when the
|
|
16
|
+
codebase needs them.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
# Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
|
|
20
|
+
# PG-derived plugin that inherited ``True`` would break
|
|
21
|
+
# ``ProviderRegistry.reference_dialect_name`` (which requires a single
|
|
22
|
+
# winner), so reset it here.
|
|
23
|
+
is_ansi_reference_dialect = False
|
|
24
|
+
# PostgreSQL is likewise the single owner of the sqlglot read-dialect
|
|
25
|
+
# fallback; a PG-derived plugin must not claim it either.
|
|
26
|
+
is_default_sqlglot_read_fallback = False
|
|
27
|
+
|
|
28
|
+
def __init__(self, dialect_name: str = "aurora-postgresql") -> None:
|
|
29
|
+
super().__init__(dialect_name=dialect_name)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
__all__ = ["AuroraPostgresqlQuirks"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Citus (distributed PostgreSQL) database provider plugin (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "citus"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "Citus (distributed PostgreSQL) database provider"
|
|
6
|
+
__plugin_dialects__ = ["citus"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "CitusProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import CitusProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["CitusProvider"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Entry-point declaration for the Citus (distributed PostgreSQL) plugin.
|
|
2
|
+
|
|
3
|
+
Citus (distributed PostgreSQL) is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
|
|
4
|
+
config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
|
|
5
|
+
``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
|
|
6
|
+
keep their ``postgresql://`` connection string and select this engine via
|
|
7
|
+
``type: citus``.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from db.plugins.citus.provider import CitusProvider
|
|
13
|
+
from db.plugins.citus.quirks import CitusQuirks
|
|
14
|
+
from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
|
|
15
|
+
from db.provider_registry import PluginInfo
|
|
16
|
+
|
|
17
|
+
PLUGIN: PluginInfo = PluginInfo(
|
|
18
|
+
name="citus",
|
|
19
|
+
version="1.0.0",
|
|
20
|
+
description="Citus (distributed PostgreSQL) database provider",
|
|
21
|
+
dialects=["citus"],
|
|
22
|
+
provider_class=CitusProvider,
|
|
23
|
+
transport="native",
|
|
24
|
+
quirks_class=CitusQuirks,
|
|
25
|
+
config_dialect="postgresql", # Citus (distributed PostgreSQL) shares PostgreSQL's config class
|
|
26
|
+
sqlalchemy_url_builder=build_sqlalchemy_url,
|
|
27
|
+
native_driver_module="psycopg",
|
|
28
|
+
)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Citus (distributed PostgreSQL) native provider (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.provider import PostgreSqlProvider
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CitusProvider(PostgreSqlProvider):
|
|
9
|
+
"""Citus (distributed PostgreSQL) — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
|
|
10
|
+
|
|
11
|
+
canonical_dialect_key = "citus"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["CitusProvider"]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Citus (distributed PostgreSQL) :class:`DialectQuirks` — inherits PostgreSQL behavior."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.quirks import PostgresqlQuirks
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CitusQuirks(PostgresqlQuirks):
|
|
9
|
+
"""Citus (distributed PostgreSQL) quirks, inheriting every PostgreSQL quirk.
|
|
10
|
+
|
|
11
|
+
Citus (distributed PostgreSQL) speaks the PostgreSQL wire protocol, so statement splitting,
|
|
12
|
+
rendering, comparison, and introspection all reuse PostgreSQL's behavior.
|
|
13
|
+
Only the ANSI-reference flag is overridden: exactly one registered plugin
|
|
14
|
+
(PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
|
|
15
|
+
must not re-claim it. Engine-specific deviations land here if and when the
|
|
16
|
+
codebase needs them.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
# Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
|
|
20
|
+
# PG-derived plugin that inherited ``True`` would break
|
|
21
|
+
# ``ProviderRegistry.reference_dialect_name`` (which requires a single
|
|
22
|
+
# winner), so reset it here.
|
|
23
|
+
is_ansi_reference_dialect = False
|
|
24
|
+
# PostgreSQL is likewise the single owner of the sqlglot read-dialect
|
|
25
|
+
# fallback; a PG-derived plugin must not claim it either.
|
|
26
|
+
is_default_sqlglot_read_fallback = False
|
|
27
|
+
|
|
28
|
+
def __init__(self, dialect_name: str = "citus") -> None:
|
|
29
|
+
super().__init__(dialect_name=dialect_name)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
__all__ = ["CitusQuirks"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""DuckDB database provider plugin."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "duckdb"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "DuckDB database provider (SQLAlchemy via duckdb_engine)"
|
|
6
|
+
__plugin_dialects__ = ["duckdb"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "DuckDBProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import DuckDBProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["DuckDBProvider"]
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""DuckDB-specific ``BaseDatabaseConfig`` subclass."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, Optional
|
|
5
|
+
|
|
6
|
+
from config.database_config import BaseDatabaseConfig, register_database_type
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# lint: allow-dialect-string: config type registration
|
|
10
|
+
@register_database_type("duckdb")
|
|
11
|
+
@dataclass
|
|
12
|
+
class DuckDBConfig(BaseDatabaseConfig):
|
|
13
|
+
"""Configuration for DuckDB connections.
|
|
14
|
+
|
|
15
|
+
DuckDB is embedded/file-based (like SQLite): no server, no
|
|
16
|
+
credentials, ``"main"`` default schema. Connections resolve to a
|
|
17
|
+
file path (or ``:memory:``) rather than a host/port.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# DuckDB specific fields
|
|
21
|
+
path: Optional[str] = None # Path to the DuckDB file (or :memory: for in-memory)
|
|
22
|
+
|
|
23
|
+
def __post_init__(self) -> None:
|
|
24
|
+
"""Resolve the file path from path/url/database and apply defaults."""
|
|
25
|
+
super().__post_init__()
|
|
26
|
+
|
|
27
|
+
if not self.path:
|
|
28
|
+
if self.url:
|
|
29
|
+
url = self.url
|
|
30
|
+
if url.startswith("duckdb://"):
|
|
31
|
+
# Match duckdb_engine's URL convention:
|
|
32
|
+
# duckdb:///rel.db (3 slashes) -> relative "rel.db"
|
|
33
|
+
# duckdb:////abs.db (4 slashes) -> absolute "/abs.db"
|
|
34
|
+
# duckdb:///:memory: -> ":memory:"
|
|
35
|
+
self.path = url[len("duckdb://") :]
|
|
36
|
+
if self.path in ("/:memory:", ":memory:"):
|
|
37
|
+
self.path = ":memory:"
|
|
38
|
+
elif self.path.startswith("//"):
|
|
39
|
+
self.path = "/" + self.path.lstrip("/")
|
|
40
|
+
elif self.path.startswith("/"):
|
|
41
|
+
self.path = self.path[1:]
|
|
42
|
+
else:
|
|
43
|
+
self.path = url
|
|
44
|
+
elif self.database:
|
|
45
|
+
self.path = self.database
|
|
46
|
+
|
|
47
|
+
if not self.path:
|
|
48
|
+
raise ValueError(
|
|
49
|
+
"Database path is required for DuckDB (use 'path' or 'database' field)"
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# DuckDB's default schema is 'main'; no credentials required.
|
|
53
|
+
if not self.schema:
|
|
54
|
+
self.schema = "main"
|
|
55
|
+
if not self.username:
|
|
56
|
+
self.username = ""
|
|
57
|
+
if not self.password:
|
|
58
|
+
self.password = ""
|
|
59
|
+
|
|
60
|
+
def build_connection_string(self) -> str:
|
|
61
|
+
"""Build a DuckDB connection string (file path)."""
|
|
62
|
+
return self.path or ""
|
|
63
|
+
|
|
64
|
+
def build_database_url(self) -> str:
|
|
65
|
+
"""Build the DuckDB plugin-owned SQLAlchemy URL."""
|
|
66
|
+
from db.provider_registry import ProviderRegistry
|
|
67
|
+
|
|
68
|
+
return ProviderRegistry.build_sqlalchemy_url(self)
|
|
69
|
+
|
|
70
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
71
|
+
"""Convert to dictionary with DuckDB specific parameters."""
|
|
72
|
+
result = super().to_dict()
|
|
73
|
+
result["path"] = self.path
|
|
74
|
+
return result
|
|
75
|
+
|
|
76
|
+
def get_connection_props(self) -> Dict[str, str]:
|
|
77
|
+
"""Get connection properties for DuckDB connection."""
|
|
78
|
+
props: Dict[str, str] = {}
|
|
79
|
+
if self.path:
|
|
80
|
+
props["path"] = self.path
|
|
81
|
+
return props
|