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.
Files changed (479) hide show
  1. {dblift-2.4.2 → dblift-2.5.1}/PKG-INFO +8 -1
  2. {dblift-2.4.2 → dblift-2.5.1}/README.md +2 -0
  3. dblift-2.5.1/db/plugins/cockroachdb/__init__.py +12 -0
  4. dblift-2.5.1/db/plugins/cockroachdb/plugin.py +28 -0
  5. dblift-2.5.1/db/plugins/cockroachdb/provider.py +79 -0
  6. dblift-2.5.1/db/plugins/cockroachdb/quirks.py +18 -0
  7. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/config.py +2 -0
  8. dblift-2.5.1/db/plugins/redshift/__init__.py +12 -0
  9. dblift-2.5.1/db/plugins/redshift/plugin.py +26 -0
  10. dblift-2.5.1/db/plugins/redshift/provider.py +95 -0
  11. dblift-2.5.1/db/plugins/redshift/quirks.py +33 -0
  12. dblift-2.5.1/db/plugins/redshift/sqlalchemy_url.py +50 -0
  13. {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/PKG-INFO +8 -1
  14. {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/SOURCES.txt +9 -0
  15. {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/entry_points.txt +2 -0
  16. {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/requires.txt +7 -0
  17. {dblift-2.4.2 → dblift-2.5.1}/pyproject.toml +17 -4
  18. {dblift-2.4.2 → dblift-2.5.1}/LICENSE +0 -0
  19. {dblift-2.4.2 → dblift-2.5.1}/api/__init__.py +0 -0
  20. {dblift-2.4.2 → dblift-2.5.1}/api/_cli_support.py +0 -0
  21. {dblift-2.4.2 → dblift-2.5.1}/api/_client_factory.py +0 -0
  22. {dblift-2.4.2 → dblift-2.5.1}/api/_client_operations.py +0 -0
  23. {dblift-2.4.2 → dblift-2.5.1}/api/_engine_config.py +0 -0
  24. {dblift-2.4.2 → dblift-2.5.1}/api/async_client.py +0 -0
  25. {dblift-2.4.2 → dblift-2.5.1}/api/client.py +0 -0
  26. {dblift-2.4.2 → dblift-2.5.1}/api/events.py +0 -0
  27. {dblift-2.4.2 → dblift-2.5.1}/api/migrations.py +0 -0
  28. {dblift-2.4.2 → dblift-2.5.1}/api/py.typed +0 -0
  29. {dblift-2.4.2 → dblift-2.5.1}/cli/__init__.py +0 -0
  30. {dblift-2.4.2 → dblift-2.5.1}/cli/_command_handlers.py +0 -0
  31. {dblift-2.4.2 → dblift-2.5.1}/cli/_config_helpers.py +0 -0
  32. {dblift-2.4.2 → dblift-2.5.1}/cli/_constants.py +0 -0
  33. {dblift-2.4.2 → dblift-2.5.1}/cli/_output.py +0 -0
  34. {dblift-2.4.2 → dblift-2.5.1}/cli/_parser_setup.py +0 -0
  35. {dblift-2.4.2 → dblift-2.5.1}/cli/commands/__init__.py +0 -0
  36. {dblift-2.4.2 → dblift-2.5.1}/cli/commands/config_command.py +0 -0
  37. {dblift-2.4.2 → dblift-2.5.1}/cli/db_utils.py +0 -0
  38. {dblift-2.4.2 → dblift-2.5.1}/cli/extensions.py +0 -0
  39. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/__init__.py +0 -0
  40. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/_shared.py +0 -0
  41. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/baseline.py +0 -0
  42. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/clean.py +0 -0
  43. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/import_flyway.py +0 -0
  44. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/info.py +0 -0
  45. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/migrate.py +0 -0
  46. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/repair.py +0 -0
  47. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/undo.py +0 -0
  48. {dblift-2.4.2 → dblift-2.5.1}/cli/handlers/validate.py +0 -0
  49. {dblift-2.4.2 → dblift-2.5.1}/cli/main.py +0 -0
  50. {dblift-2.4.2 → dblift-2.5.1}/config/__init__.py +0 -0
  51. {dblift-2.4.2 → dblift-2.5.1}/config/_credential_masking.py +0 -0
  52. {dblift-2.4.2 → dblift-2.5.1}/config/_subclasses/__init__.py +0 -0
  53. {dblift-2.4.2 → dblift-2.5.1}/config/_subclasses/dummy_config.py +0 -0
  54. {dblift-2.4.2 → dblift-2.5.1}/config/_url_builder_mixin.py +0 -0
  55. {dblift-2.4.2 → dblift-2.5.1}/config/config_builder.py +0 -0
  56. {dblift-2.4.2 → dblift-2.5.1}/config/database_config.py +0 -0
  57. {dblift-2.4.2 → dblift-2.5.1}/config/dblift_config.py +0 -0
  58. {dblift-2.4.2 → dblift-2.5.1}/config/errors.py +0 -0
  59. {dblift-2.4.2 → dblift-2.5.1}/config/property_registry.py +0 -0
  60. {dblift-2.4.2 → dblift-2.5.1}/config/secrets/__init__.py +0 -0
  61. {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_cache.py +0 -0
  62. {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_provider_base.py +0 -0
  63. {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_registry.py +0 -0
  64. {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_resolver.py +0 -0
  65. {dblift-2.4.2 → dblift-2.5.1}/config/secrets/_secrets_config.py +0 -0
  66. {dblift-2.4.2 → dblift-2.5.1}/core/__init__.py +0 -0
  67. {dblift-2.4.2 → dblift-2.5.1}/core/constants.py +0 -0
  68. {dblift-2.4.2 → dblift-2.5.1}/core/dialect_boundary.py +0 -0
  69. {dblift-2.4.2 → dblift-2.5.1}/core/exceptions.py +0 -0
  70. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/__init__.py +0 -0
  71. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_column_enricher.py +0 -0
  72. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_partition_enricher.py +0 -0
  73. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_schema_orchestrator.py +0 -0
  74. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_utils.py +0 -0
  75. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/_vendor_property_applier.py +0 -0
  76. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/base_introspector.py +0 -0
  77. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/__init__.py +0 -0
  78. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/base_extractor.py +0 -0
  79. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/column_extractor.py +0 -0
  80. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/constraint_extractor.py +0 -0
  81. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/index_extractor.py +0 -0
  82. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/misc_extractor.py +0 -0
  83. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/procedure_extractor.py +0 -0
  84. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/sequence_extractor.py +0 -0
  85. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/table_extractor.py +0 -0
  86. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/trigger_extractor.py +0 -0
  87. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/extractors/view_extractor.py +0 -0
  88. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/introspector_factory.py +0 -0
  89. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/result.py +0 -0
  90. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/schema_introspector.py +0 -0
  91. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/vendor_queries_base.py +0 -0
  92. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/vendor_queries_factory.py +0 -0
  93. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/vendor_queries_protocols.py +0 -0
  94. {dblift-2.4.2 → dblift-2.5.1}/core/introspection/version_detector.py +0 -0
  95. {dblift-2.4.2 → dblift-2.5.1}/core/logger/__init__.py +0 -0
  96. {dblift-2.4.2 → dblift-2.5.1}/core/logger/_base.py +0 -0
  97. {dblift-2.4.2 → dblift-2.5.1}/core/logger/_factory.py +0 -0
  98. {dblift-2.4.2 → dblift-2.5.1}/core/logger/_formatters.py +0 -0
  99. {dblift-2.4.2 → dblift-2.5.1}/core/logger/_levels.py +0 -0
  100. {dblift-2.4.2 → dblift-2.5.1}/core/logger/_multi.py +0 -0
  101. {dblift-2.4.2 → dblift-2.5.1}/core/logger/_null.py +0 -0
  102. {dblift-2.4.2 → dblift-2.5.1}/core/logger/console.py +0 -0
  103. {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/__init__.py +0 -0
  104. {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/_formatter_impl.py +0 -0
  105. {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/factory.py +0 -0
  106. {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/formatter.py +0 -0
  107. {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/htmlformatter.py +0 -0
  108. {dblift-2.4.2 → dblift-2.5.1}/core/logger/formatters/jsonformatter.py +0 -0
  109. {dblift-2.4.2 → dblift-2.5.1}/core/logger/log.py +0 -0
  110. {dblift-2.4.2 → dblift-2.5.1}/core/logger/results.py +0 -0
  111. {dblift-2.4.2 → dblift-2.5.1}/core/logger/templates/oldreport.html +0 -0
  112. {dblift-2.4.2 → dblift-2.5.1}/core/logger/templates/report.html +0 -0
  113. {dblift-2.4.2 → dblift-2.5.1}/core/migration/__init__.py +0 -0
  114. {dblift-2.4.2 → dblift-2.5.1}/core/migration/_type_match.py +0 -0
  115. {dblift-2.4.2 → dblift-2.5.1}/core/migration/clean_summary.py +0 -0
  116. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/__init__.py +0 -0
  117. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/_script_events.py +0 -0
  118. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/base_command.py +0 -0
  119. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/baseline_command.py +0 -0
  120. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/clean_command.py +0 -0
  121. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/import_flyway_command.py +0 -0
  122. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/info_command.py +0 -0
  123. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/migrate_command.py +0 -0
  124. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/repair_command.py +0 -0
  125. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/undo_command.py +0 -0
  126. {dblift-2.4.2 → dblift-2.5.1}/core/migration/commands/validate_command.py +0 -0
  127. {dblift-2.4.2 → dblift-2.5.1}/core/migration/encoding.py +0 -0
  128. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/__init__.py +0 -0
  129. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/execution_engine.py +0 -0
  130. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/migration_executor.py +0 -0
  131. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/migration_helpers.py +0 -0
  132. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/placeholder_manager.py +0 -0
  133. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executor/transaction_policy.py +0 -0
  134. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/__init__.py +0 -0
  135. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/base_executor.py +0 -0
  136. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/executor_factory.py +0 -0
  137. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/python_executor.py +0 -0
  138. {dblift-2.4.2 → dblift-2.5.1}/core/migration/executors/sql_executor.py +0 -0
  139. {dblift-2.4.2 → dblift-2.5.1}/core/migration/formats/__init__.py +0 -0
  140. {dblift-2.4.2 → dblift-2.5.1}/core/migration/formats/format_detector.py +0 -0
  141. {dblift-2.4.2 → dblift-2.5.1}/core/migration/formats/migration_format.py +0 -0
  142. {dblift-2.4.2 → dblift-2.5.1}/core/migration/history/__init__.py +0 -0
  143. {dblift-2.4.2 → dblift-2.5.1}/core/migration/history/migration_history_manager.py +0 -0
  144. {dblift-2.4.2 → dblift-2.5.1}/core/migration/journals/__init__.py +0 -0
  145. {dblift-2.4.2 → dblift-2.5.1}/core/migration/journals/migration_journal.py +0 -0
  146. {dblift-2.4.2 → dblift-2.5.1}/core/migration/migration.py +0 -0
  147. {dblift-2.4.2 → dblift-2.5.1}/core/migration/placeholders/__init__.py +0 -0
  148. {dblift-2.4.2 → dblift-2.5.1}/core/migration/placeholders/placeholder_service.py +0 -0
  149. {dblift-2.4.2 → dblift-2.5.1}/core/migration/rules/__init__.py +0 -0
  150. {dblift-2.4.2 → dblift-2.5.1}/core/migration/rules/migration_rules.py +0 -0
  151. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/__init__.py +0 -0
  152. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/migration_script_manager.py +0 -0
  153. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/__init__.py +0 -0
  154. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_ddl_reversers.py +0 -0
  155. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_dml_reversers.py +0 -0
  156. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_extractors.py +0 -0
  157. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_generator.py +0 -0
  158. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_helpers.py +0 -0
  159. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_models.py +0 -0
  160. {dblift-2.4.2 → dblift-2.5.1}/core/migration/scripting/undo_script_generator/_reversers.py +0 -0
  161. {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/__init__.py +0 -0
  162. {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/execution_statement.py +0 -0
  163. {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/sql_analyzer.py +0 -0
  164. {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/sql_execution_service.py +0 -0
  165. {dblift-2.4.2 → dblift-2.5.1}/core/migration/sql/statement_splitter.py +0 -0
  166. {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/__init__.py +0 -0
  167. {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_data_service.py +0 -0
  168. {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_display_state.py +0 -0
  169. {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_formatter.py +0 -0
  170. {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_state.py +0 -0
  171. {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_state_manager.py +0 -0
  172. {dblift-2.4.2 → dblift-2.5.1}/core/migration/state/migration_state_service.py +0 -0
  173. {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/__init__.py +0 -0
  174. {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/data_collector.py +0 -0
  175. {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/display_formatters.py +0 -0
  176. {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/migration_analyzer.py +0 -0
  177. {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/migration_ui.py +0 -0
  178. {dblift-2.4.2 → dblift-2.5.1}/core/migration/ui/table_renderer.py +0 -0
  179. {dblift-2.4.2 → dblift-2.5.1}/core/migration/version_utils.py +0 -0
  180. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/__init__.py +0 -0
  181. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/dependency_resolver.py +0 -0
  182. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/identifier_normalizer.py +0 -0
  183. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/object_orderer.py +0 -0
  184. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_constants.py +0 -0
  185. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_mapper.py +0 -0
  186. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_mappings.py +0 -0
  187. {dblift-2.4.2 → dblift-2.5.1}/core/normalization/type_normalizer.py +0 -0
  188. {dblift-2.4.2 → dblift-2.5.1}/core/seams/__init__.py +0 -0
  189. {dblift-2.4.2 → dblift-2.5.1}/core/seams/capabilities.py +0 -0
  190. {dblift-2.4.2 → dblift-2.5.1}/core/seams/event_listeners.py +0 -0
  191. {dblift-2.4.2 → dblift-2.5.1}/core/seams/feature_loading.py +0 -0
  192. {dblift-2.4.2 → dblift-2.5.1}/core/seams/introspection.py +0 -0
  193. {dblift-2.4.2 → dblift-2.5.1}/core/seams/license_info.py +0 -0
  194. {dblift-2.4.2 → dblift-2.5.1}/core/seams/runtime_checks.py +0 -0
  195. {dblift-2.4.2 → dblift-2.5.1}/core/seams/sql_generators.py +0 -0
  196. {dblift-2.4.2 → dblift-2.5.1}/core/seams/tier_resolver.py +0 -0
  197. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/__init__.py +0 -0
  198. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter/__init__.py +0 -0
  199. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter/alter_generator_factory.py +0 -0
  200. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter/base_alter_generator.py +0 -0
  201. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/alter_generator.py +0 -0
  202. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/base_generator.py +0 -0
  203. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/basic_table_ddl_generator.py +0 -0
  204. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/dependency_analyzer.py +0 -0
  205. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/diff_converters/__init__.py +0 -0
  206. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/diff_converters/base_converter.py +0 -0
  207. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/formatter.py +0 -0
  208. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/generator_factory.py +0 -0
  209. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/options.py +0 -0
  210. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/script_organizer.py +0 -0
  211. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/sql_generator.py +0 -0
  212. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/sql_statement.py +0 -0
  213. {dblift-2.4.2 → dblift-2.5.1}/core/sql_generator/table_ddl_render.py +0 -0
  214. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/__init__.py +0 -0
  215. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_parse_result.py +0 -0
  216. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_column.py +0 -0
  217. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_constraint.py +0 -0
  218. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_object.py +0 -0
  219. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/_base_sql_statement.py +0 -0
  220. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/base.py +0 -0
  221. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/constraint_validator.py +0 -0
  222. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/database_link.py +0 -0
  223. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/dialect.py +0 -0
  224. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/event.py +0 -0
  225. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/extension.py +0 -0
  226. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/foreign_data_wrapper.py +0 -0
  227. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/foreign_server.py +0 -0
  228. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/index.py +0 -0
  229. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/linked_server.py +0 -0
  230. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/module.py +0 -0
  231. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/package.py +0 -0
  232. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/partition.py +0 -0
  233. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/procedure.py +0 -0
  234. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/sequence.py +0 -0
  235. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/synonym.py +0 -0
  236. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/table.py +0 -0
  237. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/table_canonicalizer.py +0 -0
  238. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/table_options.py +0 -0
  239. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/trigger.py +0 -0
  240. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/user_defined_type.py +0 -0
  241. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/view.py +0 -0
  242. {dblift-2.4.2 → dblift-2.5.1}/core/sql_model/view_options.py +0 -0
  243. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/__init__.py +0 -0
  244. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/_partition_handler.py +0 -0
  245. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/_sqlglot_builders.py +0 -0
  246. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/base_statement_parser.py +0 -0
  247. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/base_tokenizer.py +0 -0
  248. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/common/__init__.py +0 -0
  249. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/common/base_parser.py +0 -0
  250. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/dialects/__init__.py +0 -0
  251. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/dialects/base_config.py +0 -0
  252. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/enhanced_regex_parser.py +0 -0
  253. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/hybrid_parser.py +0 -0
  254. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/parser_context.py +0 -0
  255. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/parser_factory.py +0 -0
  256. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/parser_interface.py +0 -0
  257. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/sqlglot_parser.py +0 -0
  258. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/tokens.py +0 -0
  259. {dblift-2.4.2 → dblift-2.5.1}/core/sql_parser/unified_regex_parser.py +0 -0
  260. {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/__init__.py +0 -0
  261. {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_checksum_validator.py +0 -0
  262. {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_flyway_compatibility.py +0 -0
  263. {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_migration_filter.py +0 -0
  264. {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_sql_syntax_validator.py +0 -0
  265. {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/_strict_mode_validator.py +0 -0
  266. {dblift-2.4.2 → dblift-2.5.1}/core/sql_validator/migration_validator.py +0 -0
  267. {dblift-2.4.2 → dblift-2.5.1}/core/state/sql_script_formatter.py +0 -0
  268. {dblift-2.4.2 → dblift-2.5.1}/core/state/sql_statement.py +0 -0
  269. {dblift-2.4.2 → dblift-2.5.1}/core/utils/__init__.py +0 -0
  270. {dblift-2.4.2 → dblift-2.5.1}/core/utils/database_url_parser.py +0 -0
  271. {dblift-2.4.2 → dblift-2.5.1}/core/utils/metadata_helpers.py +0 -0
  272. {dblift-2.4.2 → dblift-2.5.1}/core/utils/row_access.py +0 -0
  273. {dblift-2.4.2 → dblift-2.5.1}/core/utils/string_utils.py +0 -0
  274. {dblift-2.4.2 → dblift-2.5.1}/core/utils/url_masking.py +0 -0
  275. {dblift-2.4.2 → dblift-2.5.1}/db/__init__.py +0 -0
  276. {dblift-2.4.2 → dblift-2.5.1}/db/base_provider.py +0 -0
  277. {dblift-2.4.2 → dblift-2.5.1}/db/base_quirks.py +0 -0
  278. {dblift-2.4.2 → dblift-2.5.1}/db/constants.py +0 -0
  279. {dblift-2.4.2 → dblift-2.5.1}/db/dml_analysis.py +0 -0
  280. {dblift-2.4.2 → dblift-2.5.1}/db/error.py +0 -0
  281. {dblift-2.4.2 → dblift-2.5.1}/db/error_handler.py +0 -0
  282. {dblift-2.4.2 → dblift-2.5.1}/db/exceptions.py +0 -0
  283. {dblift-2.4.2 → dblift-2.5.1}/db/native_connection_manager.py +0 -0
  284. {dblift-2.4.2 → dblift-2.5.1}/db/object_naming.py +0 -0
  285. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/__init__.py +0 -0
  286. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/__init__.py +0 -0
  287. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/plugin.py +0 -0
  288. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/provider.py +0 -0
  289. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/alloydb/quirks.py +0 -0
  290. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/__init__.py +0 -0
  291. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/plugin.py +0 -0
  292. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/provider.py +0 -0
  293. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/aurora_postgresql/quirks.py +0 -0
  294. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_history_manager.py +0 -0
  295. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_locking_manager.py +0 -0
  296. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_query_executor.py +0 -0
  297. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_schema_operations.py +0 -0
  298. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_snapshot_manager.py +0 -0
  299. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/base_undo_manager.py +0 -0
  300. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/__init__.py +0 -0
  301. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/plugin.py +0 -0
  302. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/provider.py +0 -0
  303. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/citus/quirks.py +0 -0
  304. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/__init__.py +0 -0
  305. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/config.py +0 -0
  306. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/__init__.py +0 -0
  307. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/_sdk.py +0 -0
  308. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/connection_manager.py +0 -0
  309. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/history_manager.py +0 -0
  310. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/locking_manager.py +0 -0
  311. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/query_executor.py +0 -0
  312. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/cosmosdb/schema_operations.py +0 -0
  313. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/introspection/__init__.py +0 -0
  314. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/parser/__init__.py +0 -0
  315. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/parser/cosmosdb_regex_parser.py +0 -0
  316. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/plugin.py +0 -0
  317. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/provider.py +0 -0
  318. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/quirks.py +0 -0
  319. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/__init__.py +0 -0
  320. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_executor.py +0 -0
  321. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_executors.py +0 -0
  322. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_parsing.py +0 -0
  323. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_script_generation.py +0 -0
  324. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_translator.py +0 -0
  325. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/cosmosdb/sdk_translator/_translators.py +0 -0
  326. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/__init__.py +0 -0
  327. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/config.py +0 -0
  328. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/__init__.py +0 -0
  329. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/history_manager.py +0 -0
  330. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/locking_manager.py +0 -0
  331. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/db2/schema_operations.py +0 -0
  332. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/introspection/__init__.py +0 -0
  333. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/parser/__init__.py +0 -0
  334. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/parser/db2_regex_parser.py +0 -0
  335. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/parser/parser_config.py +0 -0
  336. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/plugin.py +0 -0
  337. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/provider.py +0 -0
  338. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/quirks.py +0 -0
  339. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/db2/sqlalchemy_url.py +0 -0
  340. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/__init__.py +0 -0
  341. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/config.py +0 -0
  342. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/parser/__init__.py +0 -0
  343. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/parser/duckdb_regex_parser.py +0 -0
  344. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/parser/parser_config.py +0 -0
  345. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/plugin.py +0 -0
  346. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/provider.py +0 -0
  347. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/quirks.py +0 -0
  348. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/duckdb/sqlalchemy_url.py +0 -0
  349. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/__init__.py +0 -0
  350. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/plugin.py +0 -0
  351. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/provider.py +0 -0
  352. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mariadb/quirks.py +0 -0
  353. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/__init__.py +0 -0
  354. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/config.py +0 -0
  355. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/introspection/__init__.py +0 -0
  356. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/__init__.py +0 -0
  357. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/history_manager.py +0 -0
  358. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/locking_manager.py +0 -0
  359. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/mysql/schema_operations.py +0 -0
  360. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/__init__.py +0 -0
  361. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/mysql_regex_parser.py +0 -0
  362. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/mysql_statement_parser.py +0 -0
  363. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/mysql_tokenizer.py +0 -0
  364. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/parser/parser_config.py +0 -0
  365. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/plugin.py +0 -0
  366. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/provider.py +0 -0
  367. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/quirks.py +0 -0
  368. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/mysql/sqlalchemy_url.py +0 -0
  369. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/__init__.py +0 -0
  370. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/plugin.py +0 -0
  371. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/provider.py +0 -0
  372. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/neon/quirks.py +0 -0
  373. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/__init__.py +0 -0
  374. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/config.py +0 -0
  375. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/introspection/__init__.py +0 -0
  376. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/introspection/oracle_utils.py +0 -0
  377. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/__init__.py +0 -0
  378. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/dbms_output.py +0 -0
  379. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/history_manager.py +0 -0
  380. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/locking_manager.py +0 -0
  381. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/oracle/schema_operations.py +0 -0
  382. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/__init__.py +0 -0
  383. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_comments.py +0 -0
  384. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_object_extractor.py +0 -0
  385. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_plsql_block.py +0 -0
  386. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_sqlplus.py +0 -0
  387. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/_statement_splitter.py +0 -0
  388. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/oracle_parser.py +0 -0
  389. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/oracle_statement_parser.py +0 -0
  390. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/oracle_tokenizer.py +0 -0
  391. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/parser_config.py +0 -0
  392. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/parser/sqlplus_context.py +0 -0
  393. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/plugin.py +0 -0
  394. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/provider.py +0 -0
  395. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/quirks.py +0 -0
  396. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/oracle/sqlalchemy_url.py +0 -0
  397. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/__init__.py +0 -0
  398. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/_provider_query_executor.py +0 -0
  399. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/introspection/__init__.py +0 -0
  400. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/__init__.py +0 -0
  401. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/parser_config.py +0 -0
  402. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/postgresql_regex_parser.py +0 -0
  403. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/postgresql_statement_parser.py +0 -0
  404. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/parser/postgresql_tokenizer.py +0 -0
  405. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/plugin.py +0 -0
  406. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/__init__.py +0 -0
  407. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/history_manager.py +0 -0
  408. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/locking_manager.py +0 -0
  409. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/postgresql/schema_operations.py +0 -0
  410. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/provider.py +0 -0
  411. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/quirks.py +0 -0
  412. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/postgresql/sqlalchemy_url.py +0 -0
  413. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/__init__.py +0 -0
  414. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/config.py +0 -0
  415. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/introspection/__init__.py +0 -0
  416. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/parser/__init__.py +0 -0
  417. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/parser/parser_config.py +0 -0
  418. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/parser/sqlite_regex_parser.py +0 -0
  419. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/plugin.py +0 -0
  420. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/provider.py +0 -0
  421. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/quirks.py +0 -0
  422. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlalchemy_url.py +0 -0
  423. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/__init__.py +0 -0
  424. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/connection_manager.py +0 -0
  425. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/history_manager.py +0 -0
  426. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/locking_manager.py +0 -0
  427. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/query_executor.py +0 -0
  428. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlite/sqlite/schema_operations.py +0 -0
  429. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/__init__.py +0 -0
  430. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/config.py +0 -0
  431. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/introspection/__init__.py +0 -0
  432. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/__init__.py +0 -0
  433. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/parser_config.py +0 -0
  434. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/sqlserver_regex_parser.py +0 -0
  435. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/sqlserver_statement_parser.py +0 -0
  436. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/sqlserver_tokenizer.py +0 -0
  437. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/parser/tsql_batch_separator.py +0 -0
  438. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/plugin.py +0 -0
  439. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/provider.py +0 -0
  440. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/quirks.py +0 -0
  441. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlalchemy_url.py +0 -0
  442. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/__init__.py +0 -0
  443. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/history_manager.py +0 -0
  444. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/locking_manager.py +0 -0
  445. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/sqlserver/sqlserver/schema_operations.py +0 -0
  446. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/__init__.py +0 -0
  447. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/plugin.py +0 -0
  448. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/provider.py +0 -0
  449. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/supabase/quirks.py +0 -0
  450. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/__init__.py +0 -0
  451. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/plugin.py +0 -0
  452. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/provider.py +0 -0
  453. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/timescaledb/quirks.py +0 -0
  454. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/__init__.py +0 -0
  455. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/plugin.py +0 -0
  456. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/provider.py +0 -0
  457. {dblift-2.4.2 → dblift-2.5.1}/db/plugins/yugabytedb/quirks.py +0 -0
  458. {dblift-2.4.2 → dblift-2.5.1}/db/provider_capabilities.py +0 -0
  459. {dblift-2.4.2 → dblift-2.5.1}/db/provider_interfaces.py +0 -0
  460. {dblift-2.4.2 → dblift-2.5.1}/db/provider_registry.py +0 -0
  461. {dblift-2.4.2 → dblift-2.5.1}/db/sqlalchemy_provider.py +0 -0
  462. {dblift-2.4.2 → dblift-2.5.1}/db/value_utils.py +0 -0
  463. {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/dependency_links.txt +0 -0
  464. {dblift-2.4.2 → dblift-2.5.1}/dblift.egg-info/top_level.txt +0 -0
  465. {dblift-2.4.2 → dblift-2.5.1}/integrations/__init__.py +0 -0
  466. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/__init__.py +0 -0
  467. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/_client.py +0 -0
  468. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/_engine.py +0 -0
  469. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/apps.py +0 -0
  470. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/checks.py +0 -0
  471. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/__init__.py +0 -0
  472. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/__init__.py +0 -0
  473. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/dblift_info.py +0 -0
  474. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/dblift_migrate.py +0 -0
  475. {dblift-2.4.2 → dblift-2.5.1}/integrations/django/management/commands/dblift_validate.py +0 -0
  476. {dblift-2.4.2 → dblift-2.5.1}/integrations/fastapi.py +0 -0
  477. {dblift-2.4.2 → dblift-2.5.1}/integrations/flask.py +0 -0
  478. {dblift-2.4.2 → dblift-2.5.1}/integrations/opentelemetry.py +0 -0
  479. {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.4.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"]
@@ -30,6 +30,8 @@ class PostgreSqlConfig(BaseDatabaseConfig):
30
30
  "yugabytedb",
31
31
  "timescaledb",
32
32
  "citus",
33
+ "cockroachdb",
34
+ "redshift",
33
35
  }
34
36
  )
35
37
 
@@ -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.4.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.4.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). Each
676
- # subclasses the (strict) PostgreSQL provider/quirks, so disallow_subclassing_any
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