diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index df31ab2d38bde..7a2d6998f0f36 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1024,6 +1024,55 @@ jobs:
         uses: ./.github/actions/post_tests_failure
         if: failure()
 
+  tests-postgres-min-sqlalchemy:
+    timeout-minutes: 130
+    name: >
+      MinSQLAlchemy${{needs.build-info.outputs.default-postgres-version}},
+      Py${{needs.build-info.outputs.default-python-version}}:
+      ${{needs.build-info.outputs.parallel-test-types-list-as-string}}
+    runs-on: "${{needs.build-info.outputs.runs-on}}"
+    needs: [build-info, wait-for-ci-images]
+    env:
+      RUNS_ON: "${{needs.build-info.outputs.runs-on}}"
+      PARALLEL_TEST_TYPES: "${{needs.build-info.outputs.parallel-test-types-list-as-string}}"
+      PR_LABELS: "${{needs.build-info.outputs.pull-request-labels}}"
+      FULL_TESTS_NEEDED: "${{needs.build-info.outputs.full-tests-needed}}"
+      DEBUG_RESOURCES: "${{needs.build-info.outputs.debug-resources}}"
+      BACKEND: "postgres"
+      PYTHON_MAJOR_MINOR_VERSION: "${{needs.build-info.outputs.default-python-version}}"
+      PYTHON_VERSION: "${needs.build-info.outputs.default-python-version}}"
+      POSTGRES_VERSION: "${{needs.build-info.outputs.default-postgres-version}}"
+      BACKEND_VERSION: "${{needs.build-info.outputs.default-postgres-version}}"
+      DOWNGRADE_SQLALCHEMY: "true"
+      JOB_ID: >
+        postgres-min-sqlalchemy-${{needs.build-info.outputs.default-python-version}}-
+        ${{needs.build-info.outputs.default-postgres-version}}
+      COVERAGE: "${{needs.build-info.outputs.run-coverage}}"
+    if: needs.build-info.outputs.run-tests == 'true'
+    steps:
+      - name: Cleanup repo
+        shell: bash
+        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
+      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
+        uses: actions/checkout@v3
+        with:
+          persist-credentials: false
+      - name: >
+          Prepare breeze & CI image: ${{needs.build-info.outputs.default-python-version}}:${{env.IMAGE_TAG}}
+        uses: ./.github/actions/prepare_breeze_and_image
+      - name: >
+          Tests: ${{needs.build-info.outputs.default-python-version}}:
+          ${{needs.build-info.outputs.parallel-test-types-list-as-string}}
+        run: breeze testing tests --run-in-parallel
+      - name: >
+          Post Tests success: ${{needs.build-info.outputs.default-python-version}}:Boto"
+        uses: ./.github/actions/post_tests_success
+        if: success()
+      - name: >
+          Post Tests failure: ${{needs.build-info.outputs.default-python-version}}:Boto"
+        uses: ./.github/actions/post_tests_failure
+        if: failure()
+
   tests-postgres-in-progress-features-disabled:
     timeout-minutes: 130
     name: >
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 48e626e570523..55fc05cc0e5ec 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -949,6 +949,22 @@ fi
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
 rm -f "${AIRFLOW_SOURCES}/.coveragerc"
 
+if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+    echo
+    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
+    echo
+    pip uninstall --root-user-action ignore aiobotocore -y || true
+    pip install --root-user-action ignore --upgrade boto3 botocore
+    pip check
+fi
+if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+    min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed "s/.*>=\([0-9\.]*\).*/\1/")
+    echo
+    echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: ${min_sqlalchemy_version}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore "sqlalchemy==${min_sqlalchemy_version}"
+    pip check
+fi
 
 set +u
 if [[ "${RUN_TESTS}" != "true" ]]; then
@@ -1179,13 +1195,6 @@ else
         exit 1
     fi
 fi
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
-    echo
-    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
-    echo
-    pip uninstall aiobotocore -y || true
-    pip install --upgrade boto3 botocore
-fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS
 
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 21f285295187f..60ac45d4cf62d 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -51,6 +51,7 @@
     option_celery_broker,
     option_celery_flower,
     option_db_reset,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_executor,
     option_force_build,
@@ -70,6 +71,7 @@
     option_platform_single,
     option_postgres_version,
     option_python,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_use_packages_from_dist,
     option_verbose,
@@ -161,6 +163,8 @@ def run(self):
 @option_image_tag_for_running
 @option_max_time
 @option_include_mypy_volume
+@option_upgrade_boto
+@option_downgrade_sqlalchemy
 @option_verbose
 @option_dry_run
 @option_github_repository
@@ -196,6 +200,8 @@ def shell(
     celery_broker: str,
     celery_flower: bool,
     extra_args: tuple,
+    upgrade_boto: bool,
+    downgrade_sqlalchemy: bool,
 ):
     """Enter breeze environment. this is the default command use when no other is selected."""
     if get_verbose() or get_dry_run():
@@ -233,6 +239,8 @@ def shell(
         executor=executor,
         celery_broker=celery_broker,
         celery_flower=celery_flower,
+        upgrade_boto=upgrade_boto,
+        downgrade_sqlalchemy=downgrade_sqlalchemy,
     )
     sys.exit(result.returncode)
 
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
index 81c99e793f954..9ef4f8ca96d63 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -99,6 +99,13 @@
                 "--package-format",
             ],
         },
+        {
+            "name": "Upgrading/downgrading selected packages",
+            "options": [
+                "--upgrade-boto",
+                "--downgrade-sqlalchemy",
+            ],
+        },
     ],
     "breeze compile-www-assets": [
         {
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index ee3b445cb3c7c..b5d09c944bc69 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -38,6 +38,7 @@
     option_backend,
     option_db_reset,
     option_debug_resources,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_github_repository,
     option_image_name,
@@ -52,6 +53,7 @@
     option_python,
     option_run_in_parallel,
     option_skip_cleanup,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_verbose,
 )
@@ -359,12 +361,8 @@ def run_tests_in_parallel(
     show_default=True,
     envvar="PARALLEL_TEST_TYPES",
 )
-@click.option(
-    "--upgrade-boto",
-    help="Remove aiobotocore and upgrade botocore and boto to the latest version.",
-    is_flag=True,
-    envvar="UPGRADE_BOTO",
-)
+@option_upgrade_boto
+@option_downgrade_sqlalchemy
 @click.option(
     "--collect-only",
     help="Collect tests only, do not run them.",
@@ -408,6 +406,7 @@ def command_for_tests(
     mount_sources: str,
     extra_pytest_args: tuple,
     upgrade_boto: bool,
+    downgrade_sqlalchemy: bool,
     collect_only: bool,
     remove_arm_packages: bool,
     github_repository: str,
@@ -428,6 +427,7 @@ def command_for_tests(
         forward_ports=False,
         test_type=test_type,
         upgrade_boto=upgrade_boto,
+        downgrade_sqlalchemy=downgrade_sqlalchemy,
         collect_only=collect_only,
         remove_arm_packages=remove_arm_packages,
         github_repository=github_repository,
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
index 0c91145b5eec4..b1913d9f058df 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
@@ -56,6 +56,7 @@
                 "--use-airflow-version",
                 "--mount-sources",
                 "--upgrade-boto",
+                "--downgrade-sqlalchemy",
                 "--remove-arm-packages",
                 "--skip-docker-compose-down",
             ],
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 99bc8c4d3cfd5..b2240a42c991c 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -120,6 +120,7 @@ class ShellParams:
     dry_run: bool = False
     verbose: bool = False
     upgrade_boto: bool = False
+    downgrade_sqlalchemy: bool = False
     executor: str = START_AIRFLOW_DEFAULT_ALLOWED_EXECUTORS
     celery_broker: str = DEFAULT_CELERY_BROKER
     celery_flower: bool = False
diff --git a/dev/breeze/src/airflow_breeze/utils/common_options.py b/dev/breeze/src/airflow_breeze/utils/common_options.py
index 95a0b46ebe0dd..f443587913527 100644
--- a/dev/breeze/src/airflow_breeze/utils/common_options.py
+++ b/dev/breeze/src/airflow_breeze/utils/common_options.py
@@ -623,3 +623,15 @@ def _set_default_from_parent(ctx: click.core.Context, option: click.core.Option,
     help="Local directory path of cloned airflow-site repo.",
     required=True,
 )
+option_upgrade_boto = click.option(
+    "--upgrade-boto",
+    help="Remove aiobotocore and upgrade botocore and boto to the latest version.",
+    is_flag=True,
+    envvar="UPGRADE_BOTO",
+)
+option_downgrade_sqlalchemy = click.option(
+    "--downgrade-sqlalchemy",
+    help="Downgrade SQLAlchemy to minimum supported version.",
+    is_flag=True,
+    envvar="DOWNGRADE_SQLALCHEMY",
+)
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index 82527e6710a6a..3dd9b4ffb639d 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -596,6 +596,7 @@ def update_expected_environment_variables(env: dict[str, str]) -> None:
     set_value_to_default_if_not_set(env, "TEST_TYPE", "")
     set_value_to_default_if_not_set(env, "TEST_TIMEOUT", "60")
     set_value_to_default_if_not_set(env, "UPGRADE_BOTO", "false")
+    set_value_to_default_if_not_set(env, "DOWNGRADE_SQLALCHEMY", "false")
     set_value_to_default_if_not_set(env, "UPGRADE_TO_NEWER_DEPENDENCIES", "false")
     set_value_to_default_if_not_set(env, "USE_PACKAGES_FROM_DIST", "false")
     set_value_to_default_if_not_set(env, "VERBOSE", "false")
@@ -643,6 +644,7 @@ def update_expected_environment_variables(env: dict[str, str]) -> None:
     "SQLITE_URL": "sqlite_url",
     "START_AIRFLOW": "start_airflow",
     "UPGRADE_BOTO": "upgrade_boto",
+    "DOWNGRADE_SQLALCHEMY": "downgrade_sqlalchemy",
     "USE_AIRFLOW_VERSION": "use_airflow_version",
     "USE_PACKAGES_FROM_DIST": "use_packages_from_dist",
     "VERSION_SUFFIX_FOR_PYPI": "version_suffix_for_pypi",
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 3d22259a4bd8c..9331ce8e379c5 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -62,11 +62,11 @@ setup:regenerate-command-images:d5e29ec6acb1a6af7d83772c2962f89d
 setup:self-upgrade:4af905a147fcd6670a0e33d3d369a94b
 setup:version:be116d90a21c2afe01087f7609774e1e
 setup:fd391bab5277ad3aca65987a84144d51
-shell:1462cde6f7e11a73cb42d4eec93c598e
+shell:1d7a1d16c4c9da86a3d8dc19ee698278
 start-airflow:d4815dea2cfc0af7038697c1d9a13996
 static-checks:19926b8fcea5784b28d4a0d99865363c
 testing:docker-compose-tests:fd154a058082fcfda12eb877a9a89338
 testing:helm-tests:0669be17b744ba057adbf38681bd8e68
 testing:integration-tests:e745af9dd595adaa6f17ef02fbaae3b5
-testing:tests:29da9579379b1d013c02dd6c4471b958
-testing:355a33f1e38298dba301d638d956fb55
+testing:tests:f5b196d717b2099172595063a7a3d0aa
+testing:a9bdfb94a0d08deee7aaf4037cc55a34
diff --git a/images/breeze/output_shell.svg b/images/breeze/output_shell.svg
index e9414eda1e193..2fbccea4816db 100644
--- a/images/breeze/output_shell.svg
+++ b/images/breeze/output_shell.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1611.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1660.3999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-shell-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1560.6" />
+      <rect x="0" y="0" width="1463.0" height="1609.3999999999999" />
     </clipPath>
     <clipPath id="breeze-shell-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -234,9 +234,15 @@
 <clipPath id="breeze-shell-line-62">
     <rect x="0" y="1514.3" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-shell-line-63">
+    <rect x="0" y="1538.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-shell-line-64">
+    <rect x="0" y="1563.1" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1609.6" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;shell</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1658.4" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;shell</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -305,11 +311,13 @@
 </text><text class="breeze-shell-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-shell-line-56)">│</text><text class="breeze-shell-r4" x="451.4" y="1386.4" textLength="658.8" clip-path="url(#breeze-shell-line-56)">[default:&#160;wheel]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-shell-r4" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-shell-line-56)">│</text><text class="breeze-shell-r2" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-shell-line-56)">
 </text><text class="breeze-shell-r4" x="0" y="1410.8" textLength="1464" clip-path="url(#breeze-shell-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r2" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-shell-line-57)">
 </text><text class="breeze-shell-r4" x="0" y="1435.2" textLength="24.4" clip-path="url(#breeze-shell-line-58)">╭─</text><text class="breeze-shell-r4" x="24.4" y="1435.2" textLength="195.2" clip-path="url(#breeze-shell-line-58)">&#160;Common&#160;options&#160;</text><text class="breeze-shell-r4" x="219.6" y="1435.2" textLength="1220" clip-path="url(#breeze-shell-line-58)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-shell-r4" x="1439.6" y="1435.2" textLength="24.4" clip-path="url(#breeze-shell-line-58)">─╮</text><text class="breeze-shell-r2" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-shell-line-58)">
-</text><text class="breeze-shell-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r5" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r5" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#breeze-shell-line-59)">-verbose</text><text class="breeze-shell-r6" x="158.6" y="1459.6" textLength="24.4" clip-path="url(#breeze-shell-line-59)">-v</text><text class="breeze-shell-r2" x="207.4" y="1459.6" textLength="585.6" clip-path="url(#breeze-shell-line-59)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-shell-r4" x="1451.8" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r2" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">
-</text><text class="breeze-shell-r4" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r5" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r5" x="36.6" y="1484" textLength="48.8" clip-path="url(#breeze-shell-line-60)">-dry</text><text class="breeze-shell-r5" x="85.4" y="1484" textLength="48.8" clip-path="url(#breeze-shell-line-60)">-run</text><text class="breeze-shell-r6" x="158.6" y="1484" textLength="24.4" clip-path="url(#breeze-shell-line-60)">-D</text><text class="breeze-shell-r2" x="207.4" y="1484" textLength="719.8" clip-path="url(#breeze-shell-line-60)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-shell-r4" x="1451.8" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r2" x="1464" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">
-</text><text class="breeze-shell-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r5" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">-</text><text class="breeze-shell-r5" x="36.6" y="1508.4" textLength="85.4" clip-path="url(#breeze-shell-line-61)">-answer</text><text class="breeze-shell-r6" x="158.6" y="1508.4" textLength="24.4" clip-path="url(#breeze-shell-line-61)">-a</text><text class="breeze-shell-r2" x="207.4" y="1508.4" textLength="317.2" clip-path="url(#breeze-shell-line-61)">Force&#160;answer&#160;to&#160;questions.</text><text class="breeze-shell-r7" x="536.8" y="1508.4" textLength="353.8" clip-path="url(#breeze-shell-line-61)">(y&#160;|&#160;n&#160;|&#160;q&#160;|&#160;yes&#160;|&#160;no&#160;|&#160;quit)</text><text class="breeze-shell-r4" x="1451.8" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r2" x="1464" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">
-</text><text class="breeze-shell-r4" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r5" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">-</text><text class="breeze-shell-r5" x="36.6" y="1532.8" textLength="61" clip-path="url(#breeze-shell-line-62)">-help</text><text class="breeze-shell-r6" x="158.6" y="1532.8" textLength="24.4" clip-path="url(#breeze-shell-line-62)">-h</text><text class="breeze-shell-r2" x="207.4" y="1532.8" textLength="329.4" clip-path="url(#breeze-shell-line-62)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-shell-r4" x="1451.8" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">
-</text><text class="breeze-shell-r4" x="0" y="1557.2" textLength="1464" clip-path="url(#breeze-shell-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r2" x="1464" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">
+</text><text class="breeze-shell-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r5" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r5" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#breeze-shell-line-59)">-upgrade</text><text class="breeze-shell-r5" x="134.2" y="1459.6" textLength="61" clip-path="url(#breeze-shell-line-59)">-boto</text><text class="breeze-shell-r2" x="366" y="1459.6" textLength="866.2" clip-path="url(#breeze-shell-line-59)">Remove&#160;aiobotocore&#160;and&#160;upgrade&#160;botocore&#160;and&#160;boto&#160;to&#160;the&#160;latest&#160;version.</text><text class="breeze-shell-r4" x="1451.8" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r2" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">
+</text><text class="breeze-shell-r4" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r5" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r5" x="36.6" y="1484" textLength="122" clip-path="url(#breeze-shell-line-60)">-downgrade</text><text class="breeze-shell-r5" x="158.6" y="1484" textLength="134.2" clip-path="url(#breeze-shell-line-60)">-sqlalchemy</text><text class="breeze-shell-r2" x="366" y="1484" textLength="610" clip-path="url(#breeze-shell-line-60)">Downgrade&#160;SQLAlchemy&#160;to&#160;minimum&#160;supported&#160;version.</text><text class="breeze-shell-r4" x="1451.8" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r2" x="1464" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">
+</text><text class="breeze-shell-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r5" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">-</text><text class="breeze-shell-r5" x="36.6" y="1508.4" textLength="97.6" clip-path="url(#breeze-shell-line-61)">-verbose</text><text class="breeze-shell-r6" x="317.2" y="1508.4" textLength="24.4" clip-path="url(#breeze-shell-line-61)">-v</text><text class="breeze-shell-r2" x="366" y="1508.4" textLength="585.6" clip-path="url(#breeze-shell-line-61)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-shell-r4" x="1451.8" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r2" x="1464" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">
+</text><text class="breeze-shell-r4" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r5" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">-</text><text class="breeze-shell-r5" x="36.6" y="1532.8" textLength="48.8" clip-path="url(#breeze-shell-line-62)">-dry</text><text class="breeze-shell-r5" x="85.4" y="1532.8" textLength="48.8" clip-path="url(#breeze-shell-line-62)">-run</text><text class="breeze-shell-r6" x="317.2" y="1532.8" textLength="24.4" clip-path="url(#breeze-shell-line-62)">-D</text><text class="breeze-shell-r2" x="366" y="1532.8" textLength="719.8" clip-path="url(#breeze-shell-line-62)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-shell-r4" x="1451.8" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">
+</text><text class="breeze-shell-r4" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r5" x="24.4" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">-</text><text class="breeze-shell-r5" x="36.6" y="1557.2" textLength="85.4" clip-path="url(#breeze-shell-line-63)">-answer</text><text class="breeze-shell-r6" x="317.2" y="1557.2" textLength="24.4" clip-path="url(#breeze-shell-line-63)">-a</text><text class="breeze-shell-r2" x="366" y="1557.2" textLength="317.2" clip-path="url(#breeze-shell-line-63)">Force&#160;answer&#160;to&#160;questions.</text><text class="breeze-shell-r7" x="695.4" y="1557.2" textLength="353.8" clip-path="url(#breeze-shell-line-63)">(y&#160;|&#160;n&#160;|&#160;q&#160;|&#160;yes&#160;|&#160;no&#160;|&#160;quit)</text><text class="breeze-shell-r4" x="1451.8" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r2" x="1464" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">
+</text><text class="breeze-shell-r4" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r5" x="24.4" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">-</text><text class="breeze-shell-r5" x="36.6" y="1581.6" textLength="61" clip-path="url(#breeze-shell-line-64)">-help</text><text class="breeze-shell-r6" x="317.2" y="1581.6" textLength="24.4" clip-path="url(#breeze-shell-line-64)">-h</text><text class="breeze-shell-r2" x="366" y="1581.6" textLength="329.4" clip-path="url(#breeze-shell-line-64)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-shell-r4" x="1451.8" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r2" x="1464" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">
+</text><text class="breeze-shell-r4" x="0" y="1606" textLength="1464" clip-path="url(#breeze-shell-line-65)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r2" x="1464" y="1606" textLength="12.2" clip-path="url(#breeze-shell-line-65)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_testing_tests.svg b/images/breeze/output_testing_tests.svg
index 1799ff04378fd..062258fcbc70d 100644
--- a/images/breeze/output_testing_tests.svg
+++ b/images/breeze/output_testing_tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1465.1999999999998" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1489.6" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-testing-tests-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1414.1999999999998" />
+      <rect x="0" y="0" width="1463.0" height="1438.6" />
     </clipPath>
     <clipPath id="breeze-testing-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -216,9 +216,12 @@
 <clipPath id="breeze-testing-tests-line-56">
     <rect x="0" y="1367.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-tests-line-57">
+    <rect x="0" y="1392.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1463.2" rx="8"/><text class="breeze-testing-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;testing&#160;tests</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1487.6" rx="8"/><text class="breeze-testing-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;testing&#160;tests</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -278,14 +281,15 @@
 </text><text class="breeze-testing-tests-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-47)">│</text><text class="breeze-testing-tests-r7" x="390.4" y="1166.8" textLength="1049.2" clip-path="url(#breeze-testing-tests-line-47)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-testing-tests-r4" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-47)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-47)">
 </text><text class="breeze-testing-tests-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">│</text><text class="breeze-testing-tests-r4" x="390.4" y="1191.2" textLength="1049.2" clip-path="url(#breeze-testing-tests-line-48)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-testing-tests-r4" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">
 </text><text class="breeze-testing-tests-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1215.6" textLength="97.6" clip-path="url(#breeze-testing-tests-line-49)">-upgrade</text><text class="breeze-testing-tests-r5" x="134.2" y="1215.6" textLength="61" clip-path="url(#breeze-testing-tests-line-49)">-boto</text><text class="breeze-testing-tests-r2" x="390.4" y="1215.6" textLength="866.2" clip-path="url(#breeze-testing-tests-line-49)">Remove&#160;aiobotocore&#160;and&#160;upgrade&#160;botocore&#160;and&#160;boto&#160;to&#160;the&#160;latest&#160;version.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1240" textLength="85.4" clip-path="url(#breeze-testing-tests-line-50)">-remove</text><text class="breeze-testing-tests-r5" x="122" y="1240" textLength="158.6" clip-path="url(#breeze-testing-tests-line-50)">-arm-packages</text><text class="breeze-testing-tests-r2" x="390.4" y="1240" textLength="817.4" clip-path="url(#breeze-testing-tests-line-50)">Removes&#160;arm&#160;packages&#160;from&#160;the&#160;image&#160;to&#160;test&#160;if&#160;ARM&#160;collection&#160;works</text><text class="breeze-testing-tests-r4" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1264.4" textLength="61" clip-path="url(#breeze-testing-tests-line-51)">-skip</text><text class="breeze-testing-tests-r5" x="97.6" y="1264.4" textLength="244" clip-path="url(#breeze-testing-tests-line-51)">-docker-compose-down</text><text class="breeze-testing-tests-r2" x="390.4" y="1264.4" textLength="549" clip-path="url(#breeze-testing-tests-line-51)">Skips&#160;running&#160;docker-compose&#160;down&#160;after&#160;tests</text><text class="breeze-testing-tests-r4" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1288.8" textLength="1464" clip-path="url(#breeze-testing-tests-line-52)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1313.2" textLength="24.4" clip-path="url(#breeze-testing-tests-line-53)">╭─</text><text class="breeze-testing-tests-r4" x="24.4" y="1313.2" textLength="195.2" clip-path="url(#breeze-testing-tests-line-53)">&#160;Common&#160;options&#160;</text><text class="breeze-testing-tests-r4" x="219.6" y="1313.2" textLength="1220" clip-path="url(#breeze-testing-tests-line-53)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-testing-tests-r4" x="1439.6" y="1313.2" textLength="24.4" clip-path="url(#breeze-testing-tests-line-53)">─╮</text><text class="breeze-testing-tests-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1337.6" textLength="97.6" clip-path="url(#breeze-testing-tests-line-54)">-verbose</text><text class="breeze-testing-tests-r6" x="158.6" y="1337.6" textLength="24.4" clip-path="url(#breeze-testing-tests-line-54)">-v</text><text class="breeze-testing-tests-r2" x="207.4" y="1337.6" textLength="585.6" clip-path="url(#breeze-testing-tests-line-54)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1337.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1362" textLength="48.8" clip-path="url(#breeze-testing-tests-line-55)">-dry</text><text class="breeze-testing-tests-r5" x="85.4" y="1362" textLength="48.8" clip-path="url(#breeze-testing-tests-line-55)">-run</text><text class="breeze-testing-tests-r6" x="158.6" y="1362" textLength="24.4" clip-path="url(#breeze-testing-tests-line-55)">-D</text><text class="breeze-testing-tests-r2" x="207.4" y="1362" textLength="719.8" clip-path="url(#breeze-testing-tests-line-55)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1386.4" textLength="61" clip-path="url(#breeze-testing-tests-line-56)">-help</text><text class="breeze-testing-tests-r6" x="158.6" y="1386.4" textLength="24.4" clip-path="url(#breeze-testing-tests-line-56)">-h</text><text class="breeze-testing-tests-r2" x="207.4" y="1386.4" textLength="329.4" clip-path="url(#breeze-testing-tests-line-56)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">
-</text><text class="breeze-testing-tests-r4" x="0" y="1410.8" textLength="1464" clip-path="url(#breeze-testing-tests-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1240" textLength="122" clip-path="url(#breeze-testing-tests-line-50)">-downgrade</text><text class="breeze-testing-tests-r5" x="158.6" y="1240" textLength="134.2" clip-path="url(#breeze-testing-tests-line-50)">-sqlalchemy</text><text class="breeze-testing-tests-r2" x="390.4" y="1240" textLength="610" clip-path="url(#breeze-testing-tests-line-50)">Downgrade&#160;SQLAlchemy&#160;to&#160;minimum&#160;supported&#160;version.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1264.4" textLength="85.4" clip-path="url(#breeze-testing-tests-line-51)">-remove</text><text class="breeze-testing-tests-r5" x="122" y="1264.4" textLength="158.6" clip-path="url(#breeze-testing-tests-line-51)">-arm-packages</text><text class="breeze-testing-tests-r2" x="390.4" y="1264.4" textLength="817.4" clip-path="url(#breeze-testing-tests-line-51)">Removes&#160;arm&#160;packages&#160;from&#160;the&#160;image&#160;to&#160;test&#160;if&#160;ARM&#160;collection&#160;works</text><text class="breeze-testing-tests-r4" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1288.8" textLength="61" clip-path="url(#breeze-testing-tests-line-52)">-skip</text><text class="breeze-testing-tests-r5" x="97.6" y="1288.8" textLength="244" clip-path="url(#breeze-testing-tests-line-52)">-docker-compose-down</text><text class="breeze-testing-tests-r2" x="390.4" y="1288.8" textLength="549" clip-path="url(#breeze-testing-tests-line-52)">Skips&#160;running&#160;docker-compose&#160;down&#160;after&#160;tests</text><text class="breeze-testing-tests-r4" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1313.2" textLength="1464" clip-path="url(#breeze-testing-tests-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1337.6" textLength="24.4" clip-path="url(#breeze-testing-tests-line-54)">╭─</text><text class="breeze-testing-tests-r4" x="24.4" y="1337.6" textLength="195.2" clip-path="url(#breeze-testing-tests-line-54)">&#160;Common&#160;options&#160;</text><text class="breeze-testing-tests-r4" x="219.6" y="1337.6" textLength="1220" clip-path="url(#breeze-testing-tests-line-54)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-testing-tests-r4" x="1439.6" y="1337.6" textLength="24.4" clip-path="url(#breeze-testing-tests-line-54)">─╮</text><text class="breeze-testing-tests-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1362" textLength="97.6" clip-path="url(#breeze-testing-tests-line-55)">-verbose</text><text class="breeze-testing-tests-r6" x="158.6" y="1362" textLength="24.4" clip-path="url(#breeze-testing-tests-line-55)">-v</text><text class="breeze-testing-tests-r2" x="207.4" y="1362" textLength="585.6" clip-path="url(#breeze-testing-tests-line-55)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1386.4" textLength="48.8" clip-path="url(#breeze-testing-tests-line-56)">-dry</text><text class="breeze-testing-tests-r5" x="85.4" y="1386.4" textLength="48.8" clip-path="url(#breeze-testing-tests-line-56)">-run</text><text class="breeze-testing-tests-r6" x="158.6" y="1386.4" textLength="24.4" clip-path="url(#breeze-testing-tests-line-56)">-D</text><text class="breeze-testing-tests-r2" x="207.4" y="1386.4" textLength="719.8" clip-path="url(#breeze-testing-tests-line-56)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text class="breeze-testing-tests-r5" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">-</text><text class="breeze-testing-tests-r5" x="36.6" y="1410.8" textLength="61" clip-path="url(#breeze-testing-tests-line-57)">-help</text><text class="breeze-testing-tests-r6" x="158.6" y="1410.8" textLength="24.4" clip-path="url(#breeze-testing-tests-line-57)">-h</text><text class="breeze-testing-tests-r2" x="207.4" y="1410.8" textLength="329.4" clip-path="url(#breeze-testing-tests-line-57)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-testing-tests-r4" x="1451.8" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">
+</text><text class="breeze-testing-tests-r4" x="0" y="1435.2" textLength="1464" clip-path="url(#breeze-testing-tests-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-58)">
 </text>
     </g>
     </g>
diff --git a/scripts/ci/docker-compose/_docker.env b/scripts/ci/docker-compose/_docker.env
index 2cd4bc0f7de15..aa21804e9b6f8 100644
--- a/scripts/ci/docker-compose/_docker.env
+++ b/scripts/ci/docker-compose/_docker.env
@@ -75,6 +75,7 @@ TEST_TIMEOUT
 TEST_TYPE
 UPGRADE_BOTO
 UPGRADE_TO_NEWER_DEPENDENCIES
+DOWNGRADE_SQLALCHEMY
 VERBOSE
 VERBOSE_COMMANDS
 VERSION_SUFFIX_FOR_PYPI
diff --git a/scripts/ci/docker-compose/base.yml b/scripts/ci/docker-compose/base.yml
index 17b2a197c854c..1ce740d80138a 100644
--- a/scripts/ci/docker-compose/base.yml
+++ b/scripts/ci/docker-compose/base.yml
@@ -84,6 +84,7 @@ services:
       - TEST_TYPE=${TEST_TYPE}
       - TEST_TIMEOUT=${TEST_TIMEOUT}
       - UPGRADE_BOTO=${UPGRADE_BOTO}
+      - DOWNGRADE_SQLALCHEMY=${DOWNGRADE_SQLALCHEMY}
       - UPGRADE_TO_NEWER_DEPENDENCIES=${UPGRADE_TO_NEWER_DEPENDENCIES}
       - VERBOSE=${VERBOSE}
       - VERBOSE_COMMANDS=${VERBOSE_COMMANDS}
diff --git a/scripts/ci/docker-compose/devcontainer.env b/scripts/ci/docker-compose/devcontainer.env
index d66767fa02c92..f71a0e1e390b8 100644
--- a/scripts/ci/docker-compose/devcontainer.env
+++ b/scripts/ci/docker-compose/devcontainer.env
@@ -69,6 +69,7 @@ START_AIRFLOW="false"
 SUSPENDED_PROVIDERS_FOLDERS=""
 TEST_TYPE=
 UPGRADE_BOTO="false"
+DOWNGRADE_SQLALCHEMY="false"
 UPGRADE_TO_NEWER_DEPENDENCIES="false"
 VERBOSE="false"
 VERBOSE_COMMANDS="false"
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index 67eb96defc2f3..23ad3c5328493 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -328,6 +328,22 @@ fi
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
 rm -f "${AIRFLOW_SOURCES}/.coveragerc"
 
+if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+    echo
+    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
+    echo
+    pip uninstall --root-user-action ignore aiobotocore -y || true
+    pip install --root-user-action ignore --upgrade boto3 botocore
+    pip check
+fi
+if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+    min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed "s/.*>=\([0-9\.]*\).*/\1/")
+    echo
+    echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: ${min_sqlalchemy_version}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore "sqlalchemy==${min_sqlalchemy_version}"
+    pip check
+fi
 
 set +u
 # If we do not want to run tests, we simply drop into bash
@@ -561,13 +577,6 @@ else
         exit 1
     fi
 fi
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
-    echo
-    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
-    echo
-    pip uninstall aiobotocore -y || true
-    pip install --upgrade boto3 botocore
-fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS
 
diff --git a/setup.cfg b/setup.cfg
index 367924d82ddce..26c8cb2e0312a 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -142,7 +142,7 @@ install_requires =
     # See https://sqlalche.me/e/b8d9 for details of deprecated features
     # you can set environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.
     # The issue tracking it is https://github.com/apache/airflow/issues/28723
-    sqlalchemy>=1.4.24,<2.0
+    sqlalchemy>=1.4.28,<2.0
     sqlalchemy_jsonfield>=1.0
     tabulate>=0.7.5
     tenacity>=6.2.0,!=8.2.0
