dblift 2.4.2__tar.gz → 2.5.1__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.4.2 → dblift-2.5.1}/PKG-INFO +8 -1
- {dblift-2.4.2 → dblift-2.5.1}/README.md +2 -0
- dblift-2.5.1/db/plugins/cockroachdb/__init__.py +12 -0
- dblift-2.5.1/db/plugins/cockroachdb/plugin.py +28 -0
- dblift-2.5.1/db/plugins/cockroachdb/provider.py +79 -0
- dblift-2.5.1/db/plugins/cockroachdb/quirks.py +18 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/config.py +2 -0
- dblift-2.5.1/db/plugins/redshift/__init__.py +12 -0
- dblift-2.5.1/db/plugins/redshift/plugin.py +26 -0
- dblift-2.5.1/db/plugins/redshift/provider.py +95 -0
- dblift-2.5.1/db/plugins/redshift/quirks.py +33 -0
- dblift-2.5.1/db/plugins/redshift/sqlalchemy_url.py +50 -0
- {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/PKG-INFO +8 -1
- {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/SOURCES.txt +9 -0
- {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/entry_points.txt +2 -0
- {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/requires.txt +7 -0
- {dblift-2.4.2 → dblift-2.5.1}/pyproject.toml +17 -4
- {dblift-2.4.2 → dblift-2.5.1}/LICENSE +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/_cli_support.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/_client_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/_client_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/_engine_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/async_client.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/client.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/events.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/migrations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/api/py.typed +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/_command_handlers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/_config_helpers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/_constants.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/_output.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/_parser_setup.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/commands/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/commands/config_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/db_utils.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/extensions.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/_shared.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/baseline.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/clean.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/import_flyway.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/info.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/migrate.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/repair.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/undo.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/validate.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/cli/main.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/_credential_masking.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/_subclasses/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/_subclasses/dummy_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/_url_builder_mixin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/config_builder.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/database_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/dblift_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/errors.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/property_registry.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/secrets/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_cache.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_provider_base.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_registry.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_resolver.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_secrets_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/constants.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/dialect_boundary.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/exceptions.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_column_enricher.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_partition_enricher.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_schema_orchestrator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_utils.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_vendor_property_applier.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/base_introspector.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/base_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/column_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/constraint_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/index_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/misc_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/procedure_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/sequence_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/table_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/trigger_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/view_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/introspector_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/result.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/schema_introspector.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/vendor_queries_base.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/vendor_queries_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/vendor_queries_protocols.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/introspection/version_detector.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/_base.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/_formatters.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/_levels.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/_multi.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/_null.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/console.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/_formatter_impl.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/formatter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/htmlformatter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/jsonformatter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/log.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/results.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/templates/oldreport.html +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/logger/templates/report.html +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/_type_match.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/clean_summary.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/_script_events.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/base_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/baseline_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/clean_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/import_flyway_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/info_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/migrate_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/repair_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/undo_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/validate_command.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/encoding.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/execution_engine.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/migration_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/migration_helpers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/placeholder_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/transaction_policy.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/base_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/executor_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/python_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/sql_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/formats/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/formats/format_detector.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/formats/migration_format.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/history/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/history/migration_history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/journals/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/journals/migration_journal.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/migration.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/placeholders/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/placeholders/placeholder_service.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/rules/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/rules/migration_rules.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/migration_script_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_ddl_reversers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_dml_reversers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_extractors.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_generator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_helpers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_models.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_reversers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/execution_statement.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/sql_analyzer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/sql_execution_service.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/statement_splitter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_data_service.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_display_state.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_formatter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_state.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_state_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_state_service.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/data_collector.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/display_formatters.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/migration_analyzer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/migration_ui.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/table_renderer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/migration/version_utils.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/dependency_resolver.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/identifier_normalizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/object_orderer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_constants.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_mapper.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_mappings.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_normalizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/capabilities.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/event_listeners.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/feature_loading.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/introspection.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/license_info.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/runtime_checks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/sql_generators.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/seams/tier_resolver.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter/alter_generator_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter/base_alter_generator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter_generator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/base_generator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/basic_table_ddl_generator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/dependency_analyzer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/diff_converters/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/diff_converters/base_converter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/formatter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/generator_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/options.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/script_organizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/sql_generator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/sql_statement.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/table_ddl_render.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_parse_result.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_column.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_constraint.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_object.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_statement.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/base.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/constraint_validator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/database_link.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/dialect.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/event.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/extension.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/foreign_data_wrapper.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/foreign_server.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/index.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/linked_server.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/module.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/package.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/partition.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/procedure.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/sequence.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/synonym.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/table.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/table_canonicalizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/table_options.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/trigger.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/user_defined_type.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/view.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/view_options.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/_partition_handler.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/_sqlglot_builders.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/base_statement_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/base_tokenizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/common/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/common/base_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/dialects/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/dialects/base_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/enhanced_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/hybrid_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/parser_context.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/parser_factory.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/parser_interface.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/sqlglot_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/tokens.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/unified_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_checksum_validator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_flyway_compatibility.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_migration_filter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_sql_syntax_validator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_strict_mode_validator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/migration_validator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/state/sql_script_formatter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/state/sql_statement.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/utils/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/utils/database_url_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/utils/metadata_helpers.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/utils/row_access.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/utils/string_utils.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/core/utils/url_masking.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/base_provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/base_quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/constants.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/dml_analysis.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/error.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/error_handler.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/exceptions.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/native_connection_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/object_naming.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_query_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_snapshot_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_undo_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/_sdk.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/connection_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/query_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/parser/cosmosdb_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_executors.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_parsing.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_script_generation.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_translator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_translators.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/parser/db2_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/parser/parser_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/sqlalchemy_url.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/parser/duckdb_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/parser/parser_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/sqlalchemy_url.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/mysql_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/mysql_statement_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/mysql_tokenizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/parser_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/sqlalchemy_url.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/introspection/oracle_utils.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/dbms_output.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_comments.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_object_extractor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_plsql_block.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_sqlplus.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_statement_splitter.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/oracle_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/oracle_statement_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/oracle_tokenizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/parser_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/sqlplus_context.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/sqlalchemy_url.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/_provider_query_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/parser_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/postgresql_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/postgresql_statement_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/postgresql_tokenizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/sqlalchemy_url.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/parser/parser_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/parser/sqlite_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlalchemy_url.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/connection_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/query_executor.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/introspection/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/parser_config.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/sqlserver_regex_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/sqlserver_statement_parser.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/sqlserver_tokenizer.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/tsql_batch_separator.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlalchemy_url.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/history_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/locking_manager.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/schema_operations.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/plugin.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/quirks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/provider_capabilities.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/provider_interfaces.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/provider_registry.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/sqlalchemy_provider.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/db/value_utils.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/dependency_links.txt +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/top_level.txt +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/_client.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/_engine.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/apps.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/checks.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/__init__.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/dblift_info.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/dblift_migrate.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/dblift_validate.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/fastapi.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/flask.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/integrations/opentelemetry.py +0 -0
- {dblift-2.4.2 → dblift-2.5.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dblift
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.1
|
|
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
|
|
@@ -83,6 +83,11 @@ Provides-Extra: timescaledb
|
|
|
83
83
|
Requires-Dist: psycopg[binary]>=3.1; extra == "timescaledb"
|
|
84
84
|
Provides-Extra: citus
|
|
85
85
|
Requires-Dist: psycopg[binary]>=3.1; extra == "citus"
|
|
86
|
+
Provides-Extra: cockroachdb
|
|
87
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "cockroachdb"
|
|
88
|
+
Provides-Extra: redshift
|
|
89
|
+
Requires-Dist: sqlalchemy-redshift>=1.0.0; extra == "redshift"
|
|
90
|
+
Requires-Dist: redshift-connector>=2.1.0; extra == "redshift"
|
|
86
91
|
Provides-Extra: fastapi
|
|
87
92
|
Requires-Dist: fastapi>=0.100; extra == "fastapi"
|
|
88
93
|
Provides-Extra: flask
|
|
@@ -727,6 +732,8 @@ DBLift works with these databases:
|
|
|
727
732
|
| Database | Connection URL Example | Driver extra |
|
|
728
733
|
|----------|------------------------|--------------|
|
|
729
734
|
| PostgreSQL | `postgresql+psycopg://localhost:5432/mydb` | `dblift[postgresql]` |
|
|
735
|
+
| CockroachDB | `postgresql+psycopg://localhost:26257/mydb` | `dblift[cockroachdb]` |
|
|
736
|
+
| Redshift | `postgresql+psycopg://cluster.example.com:5439/dev` | `dblift[redshift]` |
|
|
730
737
|
| SQL Server | `mssql+pymssql://localhost:1433/mydb` | `dblift[sqlserver]` |
|
|
731
738
|
| Oracle | `oracle+oracledb://localhost:1521?sid=SID` | `dblift[oracle]` |
|
|
732
739
|
| MySQL | `mysql+pymysql://localhost:3306/mydb` | `dblift[mysql]` |
|
|
@@ -630,6 +630,8 @@ DBLift works with these databases:
|
|
|
630
630
|
| Database | Connection URL Example | Driver extra |
|
|
631
631
|
|----------|------------------------|--------------|
|
|
632
632
|
| PostgreSQL | `postgresql+psycopg://localhost:5432/mydb` | `dblift[postgresql]` |
|
|
633
|
+
| CockroachDB | `postgresql+psycopg://localhost:26257/mydb` | `dblift[cockroachdb]` |
|
|
634
|
+
| Redshift | `postgresql+psycopg://cluster.example.com:5439/dev` | `dblift[redshift]` |
|
|
633
635
|
| SQL Server | `mssql+pymssql://localhost:1433/mydb` | `dblift[sqlserver]` |
|
|
634
636
|
| Oracle | `oracle+oracledb://localhost:1521?sid=SID` | `dblift[oracle]` |
|
|
635
637
|
| MySQL | `mysql+pymysql://localhost:3306/mydb` | `dblift[mysql]` |
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""CockroachDB database provider plugin (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "cockroachdb"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "CockroachDB database provider"
|
|
6
|
+
__plugin_dialects__ = ["cockroachdb"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "CockroachdbProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import CockroachdbProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["CockroachdbProvider"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Entry-point declaration for the CockroachDB plugin.
|
|
2
|
+
|
|
3
|
+
CockroachDB is PostgreSQL-compatible: this plugin reuses PostgreSQL's config
|
|
4
|
+
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: cockroachdb``.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from db.plugins.cockroachdb.provider import CockroachdbProvider
|
|
13
|
+
from db.plugins.cockroachdb.quirks import CockroachdbQuirks
|
|
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="cockroachdb",
|
|
19
|
+
version="1.0.0",
|
|
20
|
+
description="CockroachDB database provider",
|
|
21
|
+
dialects=["cockroachdb"],
|
|
22
|
+
provider_class=CockroachdbProvider,
|
|
23
|
+
transport="native",
|
|
24
|
+
quirks_class=CockroachdbQuirks,
|
|
25
|
+
config_dialect="postgresql",
|
|
26
|
+
sqlalchemy_url_builder=build_sqlalchemy_url,
|
|
27
|
+
native_driver_module="psycopg",
|
|
28
|
+
)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""CockroachDB native provider (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
|
|
7
|
+
from db.plugins.postgresql.provider import PostgreSqlProvider
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _is_lock_contention_error(error: Exception) -> bool:
|
|
11
|
+
message = str(error).lower()
|
|
12
|
+
markers = (
|
|
13
|
+
"duplicate key",
|
|
14
|
+
"unique constraint",
|
|
15
|
+
"violates unique",
|
|
16
|
+
)
|
|
17
|
+
return any(marker in message for marker in markers)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CockroachdbProvider(PostgreSqlProvider):
|
|
21
|
+
"""CockroachDB provider with table-backed migration locking."""
|
|
22
|
+
|
|
23
|
+
canonical_dialect_key = "cockroachdb"
|
|
24
|
+
|
|
25
|
+
def acquire_migration_lock(
|
|
26
|
+
self,
|
|
27
|
+
schema: str,
|
|
28
|
+
wait_timeout_seconds: int = 60,
|
|
29
|
+
) -> bool:
|
|
30
|
+
"""Acquire a CockroachDB migration lock using a committed lock row."""
|
|
31
|
+
self.create_migration_lock_table_if_not_exists(schema)
|
|
32
|
+
lock_table = self.MIGRATION_LOCK_TABLE
|
|
33
|
+
qualified_table = self.get_schema_qualified_name(schema, lock_table)
|
|
34
|
+
|
|
35
|
+
deadline = time.monotonic() + max(0, int(wait_timeout_seconds))
|
|
36
|
+
while True:
|
|
37
|
+
try:
|
|
38
|
+
self.execute_statement(
|
|
39
|
+
f"""
|
|
40
|
+
INSERT INTO {qualified_table} (lock_name, locked_at)
|
|
41
|
+
VALUES (?, CURRENT_TIMESTAMP)
|
|
42
|
+
""",
|
|
43
|
+
params=["migration"],
|
|
44
|
+
)
|
|
45
|
+
return True
|
|
46
|
+
except Exception as exc:
|
|
47
|
+
self._rollback_failed_lock_attempt()
|
|
48
|
+
if not _is_lock_contention_error(exc):
|
|
49
|
+
raise
|
|
50
|
+
if time.monotonic() >= deadline:
|
|
51
|
+
return False
|
|
52
|
+
time.sleep(min(0.2, max(0, deadline - time.monotonic())))
|
|
53
|
+
|
|
54
|
+
def release_migration_lock(self, schema: str) -> bool:
|
|
55
|
+
"""Release the CockroachDB migration lock row."""
|
|
56
|
+
if not self.table_exists(schema, self.MIGRATION_LOCK_TABLE):
|
|
57
|
+
return True
|
|
58
|
+
lock_table = self.MIGRATION_LOCK_TABLE
|
|
59
|
+
qualified_table = self.get_schema_qualified_name(schema, lock_table)
|
|
60
|
+
affected = self.execute_statement(
|
|
61
|
+
f"""
|
|
62
|
+
DELETE FROM {qualified_table}
|
|
63
|
+
WHERE lock_name = ?
|
|
64
|
+
""",
|
|
65
|
+
params=["migration"],
|
|
66
|
+
)
|
|
67
|
+
return affected > 0
|
|
68
|
+
|
|
69
|
+
def _rollback_failed_lock_attempt(self) -> None:
|
|
70
|
+
connection = getattr(self, "_connection", None)
|
|
71
|
+
if connection is not None:
|
|
72
|
+
try:
|
|
73
|
+
connection.rollback()
|
|
74
|
+
except Exception as exc:
|
|
75
|
+
message = "Could not rollback failed CockroachDB lock attempt"
|
|
76
|
+
raise RuntimeError(message) from exc
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
__all__ = ["CockroachdbProvider"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""CockroachDB :class:`DialectQuirks` - inherits PostgreSQL behavior."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.quirks import PostgresqlQuirks
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CockroachdbQuirks(PostgresqlQuirks):
|
|
9
|
+
"""CockroachDB quirks, inheriting PostgreSQL behavior."""
|
|
10
|
+
|
|
11
|
+
is_ansi_reference_dialect = False
|
|
12
|
+
is_default_sqlglot_read_fallback = False
|
|
13
|
+
|
|
14
|
+
def __init__(self, dialect_name: str = "cockroachdb") -> None:
|
|
15
|
+
super().__init__(dialect_name=dialect_name)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["CockroachdbQuirks"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Redshift database provider plugin (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "redshift"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "Redshift database provider"
|
|
6
|
+
__plugin_dialects__ = ["redshift"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "RedshiftProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import RedshiftProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["RedshiftProvider"]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""Entry-point declaration for the Redshift plugin.
|
|
2
|
+
|
|
3
|
+
Redshift is PostgreSQL-wire-compatible, but it needs the Redshift SQLAlchemy
|
|
4
|
+
dialect/driver instead of the standard PostgreSQL dialect because Redshift does
|
|
5
|
+
not implement every PostgreSQL connection bootstrap query.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from db.plugins.redshift.provider import RedshiftProvider
|
|
11
|
+
from db.plugins.redshift.quirks import RedshiftQuirks
|
|
12
|
+
from db.plugins.redshift.sqlalchemy_url import build_sqlalchemy_url
|
|
13
|
+
from db.provider_registry import PluginInfo
|
|
14
|
+
|
|
15
|
+
PLUGIN: PluginInfo = PluginInfo(
|
|
16
|
+
name="redshift",
|
|
17
|
+
version="1.0.0",
|
|
18
|
+
description="Redshift database provider",
|
|
19
|
+
dialects=["redshift"],
|
|
20
|
+
provider_class=RedshiftProvider,
|
|
21
|
+
transport="native",
|
|
22
|
+
quirks_class=RedshiftQuirks,
|
|
23
|
+
config_dialect="postgresql",
|
|
24
|
+
sqlalchemy_url_builder=build_sqlalchemy_url,
|
|
25
|
+
native_driver_module="redshift_connector",
|
|
26
|
+
)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Redshift native provider (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from db.plugins.postgresql.provider import PostgreSqlProvider
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _is_statement_timeout_error(error: Exception) -> bool:
|
|
11
|
+
message = str(error).lower()
|
|
12
|
+
return "statement_timeout" in message or "statement timeout" in message
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RedshiftProvider(PostgreSqlProvider):
|
|
16
|
+
"""Redshift provider with Redshift-specific history and locking SQL."""
|
|
17
|
+
|
|
18
|
+
canonical_dialect_key = "redshift"
|
|
19
|
+
_migration_lock_connection: Any | None = None
|
|
20
|
+
_migration_lock_transaction: Any | None = None
|
|
21
|
+
|
|
22
|
+
def acquire_migration_lock(
|
|
23
|
+
self,
|
|
24
|
+
schema: str,
|
|
25
|
+
wait_timeout_seconds: int = 60,
|
|
26
|
+
) -> bool:
|
|
27
|
+
"""Acquire a Redshift table lock on a dedicated transaction."""
|
|
28
|
+
if getattr(self, "_migration_lock_transaction", None) is not None:
|
|
29
|
+
return True
|
|
30
|
+
|
|
31
|
+
self.create_migration_lock_table_if_not_exists(schema)
|
|
32
|
+
connection = self.engine.connect()
|
|
33
|
+
transaction = connection.begin()
|
|
34
|
+
try:
|
|
35
|
+
timeout_ms = max(1, int(wait_timeout_seconds) * 1000)
|
|
36
|
+
connection.exec_driver_sql(f"SET statement_timeout = {timeout_ms}")
|
|
37
|
+
table = self.MIGRATION_LOCK_TABLE
|
|
38
|
+
qualified_table = self.get_schema_qualified_name(schema, table)
|
|
39
|
+
connection.exec_driver_sql(f"LOCK {qualified_table}")
|
|
40
|
+
except Exception as exc:
|
|
41
|
+
try:
|
|
42
|
+
transaction.rollback()
|
|
43
|
+
finally:
|
|
44
|
+
connection.close()
|
|
45
|
+
if _is_statement_timeout_error(exc):
|
|
46
|
+
return False
|
|
47
|
+
raise
|
|
48
|
+
|
|
49
|
+
self._migration_lock_connection = connection
|
|
50
|
+
self._migration_lock_transaction = transaction
|
|
51
|
+
return True
|
|
52
|
+
|
|
53
|
+
def release_migration_lock(self, schema: str) -> bool:
|
|
54
|
+
"""Release the Redshift migration lock by ending its transaction."""
|
|
55
|
+
transaction = getattr(self, "_migration_lock_transaction", None)
|
|
56
|
+
connection = getattr(self, "_migration_lock_connection", None)
|
|
57
|
+
if transaction is None or connection is None:
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
transaction.commit()
|
|
62
|
+
return True
|
|
63
|
+
except Exception:
|
|
64
|
+
try:
|
|
65
|
+
transaction.rollback()
|
|
66
|
+
except Exception:
|
|
67
|
+
pass
|
|
68
|
+
return False
|
|
69
|
+
finally:
|
|
70
|
+
try:
|
|
71
|
+
connection.close()
|
|
72
|
+
finally:
|
|
73
|
+
self._migration_lock_connection = None
|
|
74
|
+
self._migration_lock_transaction = None
|
|
75
|
+
|
|
76
|
+
def create_history_table(self, schema: str, table_name: str) -> str:
|
|
77
|
+
"""Return SQL for the Redshift migration history table."""
|
|
78
|
+
qualified_table = self.get_schema_qualified_name(schema, table_name)
|
|
79
|
+
return f"""
|
|
80
|
+
CREATE TABLE IF NOT EXISTS {qualified_table} (
|
|
81
|
+
installed_rank INTEGER IDENTITY(1,1) PRIMARY KEY,
|
|
82
|
+
version VARCHAR(50),
|
|
83
|
+
description VARCHAR(200) NOT NULL,
|
|
84
|
+
type VARCHAR(20) NOT NULL,
|
|
85
|
+
script VARCHAR(1000) NOT NULL,
|
|
86
|
+
checksum VARCHAR(64),
|
|
87
|
+
installed_by VARCHAR(100) NOT NULL,
|
|
88
|
+
installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
89
|
+
execution_time INTEGER NOT NULL,
|
|
90
|
+
success BOOLEAN NOT NULL
|
|
91
|
+
)
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
__all__ = ["RedshiftProvider"]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Redshift :class:`DialectQuirks` - inherits PostgreSQL behavior."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.quirks import PostgresqlQuirks
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RedshiftQuirks(PostgresqlQuirks):
|
|
9
|
+
"""Redshift quirks, inheriting PostgreSQL behavior."""
|
|
10
|
+
|
|
11
|
+
is_ansi_reference_dialect = False
|
|
12
|
+
is_default_sqlglot_read_fallback = False
|
|
13
|
+
|
|
14
|
+
def __init__(self, dialect_name: str = "redshift") -> None:
|
|
15
|
+
super().__init__(dialect_name=dialect_name)
|
|
16
|
+
|
|
17
|
+
def build_snapshot_table_ddl(
|
|
18
|
+
self,
|
|
19
|
+
qualified_table: str,
|
|
20
|
+
snapshot_id_size: int,
|
|
21
|
+
checksum_size: int,
|
|
22
|
+
) -> str:
|
|
23
|
+
"""Render snapshot storage with Redshift's widest VARCHAR payload column."""
|
|
24
|
+
return (
|
|
25
|
+
f"CREATE TABLE {qualified_table} ("
|
|
26
|
+
f"snapshot_id VARCHAR({snapshot_id_size}) PRIMARY KEY, "
|
|
27
|
+
f"captured_at VARCHAR({snapshot_id_size}) NOT NULL, "
|
|
28
|
+
f"checksum VARCHAR({checksum_size}) NOT NULL, "
|
|
29
|
+
f"model_data VARCHAR(MAX) NOT NULL)"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
__all__ = ["RedshiftQuirks"]
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""SQLAlchemy URL construction for the Redshift plugin."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, cast
|
|
4
|
+
|
|
5
|
+
from sqlalchemy.engine import URL, make_url
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _string_mapping(values: Any) -> Dict[str, str]:
|
|
9
|
+
if not isinstance(values, dict):
|
|
10
|
+
return {}
|
|
11
|
+
return {str(key): str(value) for key, value in values.items()}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _query_mapping(database_config: Any, base_query: Any = None) -> Dict[str, str]:
|
|
15
|
+
query = _string_mapping(base_query)
|
|
16
|
+
query.update(_string_mapping(getattr(database_config, "extra_params", None)))
|
|
17
|
+
query.update(_string_mapping(getattr(database_config, "options", None)))
|
|
18
|
+
|
|
19
|
+
return query
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def build_sqlalchemy_url(database_config: Any) -> str:
|
|
23
|
+
"""Build a Redshift SQLAlchemy URL using the Amazon Redshift connector."""
|
|
24
|
+
raw_url = getattr(database_config, "url", None)
|
|
25
|
+
if isinstance(raw_url, str) and raw_url:
|
|
26
|
+
url = make_url(raw_url)
|
|
27
|
+
if url.drivername.startswith(("postgresql", "postgres", "redshift")):
|
|
28
|
+
url = url.set(drivername="redshift+redshift_connector")
|
|
29
|
+
username = getattr(database_config, "username", None) or url.username or None
|
|
30
|
+
password = getattr(database_config, "password", None) or url.password or None
|
|
31
|
+
if username != url.username or password != url.password:
|
|
32
|
+
url = url.set(username=username, password=password)
|
|
33
|
+
query = _query_mapping(database_config, url.query)
|
|
34
|
+
if query != dict(url.query):
|
|
35
|
+
url = url.set(query=query)
|
|
36
|
+
return cast(str, url.render_as_string(hide_password=False))
|
|
37
|
+
raise ValueError("Redshift native connections require a SQLAlchemy URL")
|
|
38
|
+
|
|
39
|
+
return cast(
|
|
40
|
+
str,
|
|
41
|
+
URL.create(
|
|
42
|
+
"redshift+redshift_connector",
|
|
43
|
+
username=getattr(database_config, "username", None) or None,
|
|
44
|
+
password=getattr(database_config, "password", None) or None,
|
|
45
|
+
host=getattr(database_config, "host", None) or "localhost",
|
|
46
|
+
port=getattr(database_config, "port", None),
|
|
47
|
+
database=getattr(database_config, "database", None),
|
|
48
|
+
query=_query_mapping(database_config),
|
|
49
|
+
).render_as_string(hide_password=False),
|
|
50
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dblift
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.1
|
|
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
|
|
@@ -83,6 +83,11 @@ Provides-Extra: timescaledb
|
|
|
83
83
|
Requires-Dist: psycopg[binary]>=3.1; extra == "timescaledb"
|
|
84
84
|
Provides-Extra: citus
|
|
85
85
|
Requires-Dist: psycopg[binary]>=3.1; extra == "citus"
|
|
86
|
+
Provides-Extra: cockroachdb
|
|
87
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "cockroachdb"
|
|
88
|
+
Provides-Extra: redshift
|
|
89
|
+
Requires-Dist: sqlalchemy-redshift>=1.0.0; extra == "redshift"
|
|
90
|
+
Requires-Dist: redshift-connector>=2.1.0; extra == "redshift"
|
|
86
91
|
Provides-Extra: fastapi
|
|
87
92
|
Requires-Dist: fastapi>=0.100; extra == "fastapi"
|
|
88
93
|
Provides-Extra: flask
|
|
@@ -727,6 +732,8 @@ DBLift works with these databases:
|
|
|
727
732
|
| Database | Connection URL Example | Driver extra |
|
|
728
733
|
|----------|------------------------|--------------|
|
|
729
734
|
| PostgreSQL | `postgresql+psycopg://localhost:5432/mydb` | `dblift[postgresql]` |
|
|
735
|
+
| CockroachDB | `postgresql+psycopg://localhost:26257/mydb` | `dblift[cockroachdb]` |
|
|
736
|
+
| Redshift | `postgresql+psycopg://cluster.example.com:5439/dev` | `dblift[redshift]` |
|
|
730
737
|
| SQL Server | `mssql+pymssql://localhost:1433/mydb` | `dblift[sqlserver]` |
|
|
731
738
|
| Oracle | `oracle+oracledb://localhost:1521?sid=SID` | `dblift[oracle]` |
|
|
732
739
|
| MySQL | `mysql+pymysql://localhost:3306/mydb` | `dblift[mysql]` |
|
|
@@ -291,6 +291,10 @@ db/plugins/citus/__init__.py
|
|
|
291
291
|
db/plugins/citus/plugin.py
|
|
292
292
|
db/plugins/citus/provider.py
|
|
293
293
|
db/plugins/citus/quirks.py
|
|
294
|
+
db/plugins/cockroachdb/__init__.py
|
|
295
|
+
db/plugins/cockroachdb/plugin.py
|
|
296
|
+
db/plugins/cockroachdb/provider.py
|
|
297
|
+
db/plugins/cockroachdb/quirks.py
|
|
294
298
|
db/plugins/cosmosdb/__init__.py
|
|
295
299
|
db/plugins/cosmosdb/config.py
|
|
296
300
|
db/plugins/cosmosdb/plugin.py
|
|
@@ -401,6 +405,11 @@ db/plugins/postgresql/postgresql/__init__.py
|
|
|
401
405
|
db/plugins/postgresql/postgresql/history_manager.py
|
|
402
406
|
db/plugins/postgresql/postgresql/locking_manager.py
|
|
403
407
|
db/plugins/postgresql/postgresql/schema_operations.py
|
|
408
|
+
db/plugins/redshift/__init__.py
|
|
409
|
+
db/plugins/redshift/plugin.py
|
|
410
|
+
db/plugins/redshift/provider.py
|
|
411
|
+
db/plugins/redshift/quirks.py
|
|
412
|
+
db/plugins/redshift/sqlalchemy_url.py
|
|
404
413
|
db/plugins/sqlite/__init__.py
|
|
405
414
|
db/plugins/sqlite/config.py
|
|
406
415
|
db/plugins/sqlite/plugin.py
|
|
@@ -5,6 +5,7 @@ dblift = cli.main:main
|
|
|
5
5
|
alloydb = db.plugins.alloydb.plugin:PLUGIN
|
|
6
6
|
aurora-postgresql = db.plugins.aurora_postgresql.plugin:PLUGIN
|
|
7
7
|
citus = db.plugins.citus.plugin:PLUGIN
|
|
8
|
+
cockroachdb = db.plugins.cockroachdb.plugin:PLUGIN
|
|
8
9
|
cosmosdb = db.plugins.cosmosdb.plugin:PLUGIN
|
|
9
10
|
db2 = db.plugins.db2.plugin:PLUGIN
|
|
10
11
|
duckdb = db.plugins.duckdb.plugin:PLUGIN
|
|
@@ -13,6 +14,7 @@ mysql = db.plugins.mysql.plugin:PLUGIN
|
|
|
13
14
|
neon = db.plugins.neon.plugin:PLUGIN
|
|
14
15
|
oracle = db.plugins.oracle.plugin:PLUGIN
|
|
15
16
|
postgresql = db.plugins.postgresql.plugin:PLUGIN
|
|
17
|
+
redshift = db.plugins.redshift.plugin:PLUGIN
|
|
16
18
|
sqlite = db.plugins.sqlite.plugin:PLUGIN
|
|
17
19
|
sqlserver = db.plugins.sqlserver.plugin:PLUGIN
|
|
18
20
|
supabase = db.plugins.supabase.plugin:PLUGIN
|
|
@@ -23,6 +23,9 @@ psycopg[binary]>=3.1
|
|
|
23
23
|
[citus]
|
|
24
24
|
psycopg[binary]>=3.1
|
|
25
25
|
|
|
26
|
+
[cockroachdb]
|
|
27
|
+
psycopg[binary]>=3.1
|
|
28
|
+
|
|
26
29
|
[db2]
|
|
27
30
|
ibm_db>=3.2
|
|
28
31
|
ibm_db_sa>=0.4
|
|
@@ -88,6 +91,10 @@ opentelemetry-api>=1.20
|
|
|
88
91
|
[postgresql]
|
|
89
92
|
psycopg[binary]>=3.1
|
|
90
93
|
|
|
94
|
+
[redshift]
|
|
95
|
+
sqlalchemy-redshift>=1.0.0
|
|
96
|
+
redshift-connector>=2.1.0
|
|
97
|
+
|
|
91
98
|
[sqlserver]
|
|
92
99
|
pymssql>=2.3
|
|
93
100
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dblift"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.5.1"
|
|
8
8
|
description = "A database migration tool that supports multiple databases with native Python drivers"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -61,6 +61,8 @@ alloydb = "db.plugins.alloydb.plugin:PLUGIN"
|
|
|
61
61
|
yugabytedb = "db.plugins.yugabytedb.plugin:PLUGIN"
|
|
62
62
|
timescaledb = "db.plugins.timescaledb.plugin:PLUGIN"
|
|
63
63
|
citus = "db.plugins.citus.plugin:PLUGIN"
|
|
64
|
+
cockroachdb = "db.plugins.cockroachdb.plugin:PLUGIN"
|
|
65
|
+
redshift = "db.plugins.redshift.plugin:PLUGIN"
|
|
64
66
|
|
|
65
67
|
# CLI command parser extensions (third-party packages can add subcommands
|
|
66
68
|
# by loading a function that receives the top-level ArgumentParser).
|
|
@@ -131,6 +133,8 @@ alloydb = ["psycopg[binary]>=3.1"]
|
|
|
131
133
|
yugabytedb = ["psycopg[binary]>=3.1"]
|
|
132
134
|
timescaledb = ["psycopg[binary]>=3.1"]
|
|
133
135
|
citus = ["psycopg[binary]>=3.1"]
|
|
136
|
+
cockroachdb = ["psycopg[binary]>=3.1"]
|
|
137
|
+
redshift = ["sqlalchemy-redshift>=1.0.0", "redshift-connector>=2.1.0"]
|
|
134
138
|
fastapi = ["fastapi>=0.100"]
|
|
135
139
|
flask = ["flask>=2.3"]
|
|
136
140
|
django = ["Django>=4.2"]
|
|
@@ -672,9 +676,9 @@ warn_unused_ignores = true
|
|
|
672
676
|
strict_equality = true
|
|
673
677
|
|
|
674
678
|
# strict db/plugins/<pg-compatible> — thin PostgreSQL-derived plugins (Neon,
|
|
675
|
-
# Supabase, Aurora PostgreSQL, AlloyDB, YugabyteDB, TimescaleDB, Citus
|
|
676
|
-
# subclasses the (strict) PostgreSQL provider/
|
|
677
|
-
# is safe.
|
|
679
|
+
# Supabase, Aurora PostgreSQL, AlloyDB, YugabyteDB, TimescaleDB, Citus,
|
|
680
|
+
# CockroachDB, Redshift). Each subclasses the (strict) PostgreSQL provider/
|
|
681
|
+
# quirks, so disallow_subclassing_any is safe.
|
|
678
682
|
[[tool.mypy.overrides]]
|
|
679
683
|
module = [
|
|
680
684
|
"db.plugins.neon",
|
|
@@ -705,6 +709,15 @@ module = [
|
|
|
705
709
|
"db.plugins.citus.plugin",
|
|
706
710
|
"db.plugins.citus.provider",
|
|
707
711
|
"db.plugins.citus.quirks",
|
|
712
|
+
"db.plugins.cockroachdb",
|
|
713
|
+
"db.plugins.cockroachdb.plugin",
|
|
714
|
+
"db.plugins.cockroachdb.provider",
|
|
715
|
+
"db.plugins.cockroachdb.quirks",
|
|
716
|
+
"db.plugins.redshift",
|
|
717
|
+
"db.plugins.redshift.plugin",
|
|
718
|
+
"db.plugins.redshift.provider",
|
|
719
|
+
"db.plugins.redshift.quirks",
|
|
720
|
+
"db.plugins.redshift.sqlalchemy_url",
|
|
708
721
|
]
|
|
709
722
|
disallow_any_generics = true
|
|
710
723
|
disallow_subclassing_any = true
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|