This is an automated email from the ASF dual-hosted git repository.

ephraimanierobi pushed a commit to branch v2-7-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 6d62f3febeaf213ffc11b1a47dcbeb7292ed711e
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Sep 12 11:49:56 2023 +0200

    Update min-sqlalchemy version to account for latest features used (#34293)
    
    Some of the recent sqlalchemy changes are not working with minimum
    version of sqlalchemy of ours - for example `where` syntax does
    not allow moe than one clause and we are already passing more
    in _do_delete_old_records (added in #33527). This syntax however
    was added in SQL Alchemy 1.4.28 and our minimum version was
    1.4.27.
    
    This change bumps the minimum SQLAlchemy version to 1.4.28 but it also
    adds a special test job that only runs on Postgres that downgrades
    the SQLAlchemy to the minimum supported version (retrieved from
    setup.cfg). This way, we will be able to detect such incompatible
    changes at the PR time. This is a new flag `--downgrade-sqlalchemy`
    on test command that works similar to earlier `--upgrade-boto`.
    
    We also enable the `--upgrade-boto` and `--downgrade-sqlalchemy` flags
    to be used for `breeze shell` command - thanks to that we can
    easily test both flags with `breeze shell` command.
    
    (cherry picked from commit efbead9fe7462b3634b6d9c842bd9a7ac78a0207)
---
 .github/workflows/ci.yml                           | 49 ++++++++++++++++++++++
 Dockerfile.ci                                      | 23 ++++++----
 .../airflow_breeze/commands/developer_commands.py  |  8 ++++
 .../commands/developer_commands_config.py          |  7 ++++
 .../airflow_breeze/commands/testing_commands.py    | 12 +++---
 .../commands/testing_commands_config.py            |  1 +
 .../src/airflow_breeze/params/shell_params.py      |  1 +
 .../src/airflow_breeze/utils/common_options.py     | 12 ++++++
 .../airflow_breeze/utils/docker_command_utils.py   |  2 +
 images/breeze/output-commands-hash.txt             |  6 +--
 images/breeze/output_shell.svg                     | 34 +++++++++++----
 images/breeze/output_testing_tests.svg             | 26 +++++++-----
 scripts/ci/docker-compose/_docker.env              |  1 +
 scripts/ci/docker-compose/base.yml                 |  1 +
 scripts/ci/docker-compose/devcontainer.env         |  1 +
 scripts/docker/entrypoint_ci.sh                    | 23 ++++++----
 setup.cfg                                          |  2 +-
 17 files changed, 165 insertions(+), 44 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6ca7543136..39ed3ac08d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1021,6 +1021,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 9092465c82..a0f47d86d3 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -937,6 +937,22 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; 
then
 fi
 
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
+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
@@ -1166,13 +1182,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 92b3f7baa0..5c569ba811 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 @@ from airflow_breeze.utils.common_options import (
     option_celery_broker,
     option_celery_flower,
     option_db_reset,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_executor,
     option_force_build,
@@ -70,6 +71,7 @@ from airflow_breeze.utils.common_options import (
     option_platform_single,
     option_postgres_version,
     option_python,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_use_packages_from_dist,
     option_verbose,
@@ -162,6 +164,8 @@ class TimerThread(threading.Thread):
 @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
@@ -197,6 +201,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():
@@ -234,6 +240,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 81c99e793f..9ef4f8ca96 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 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--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 d892727ee4..7acd6cffd6 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 @@ from airflow_breeze.utils.common_options import (
     option_backend,
     option_db_reset,
     option_debug_resources,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_github_repository,
     option_image_name,
@@ -52,6 +53,7 @@ from airflow_breeze.utils.common_options import (
     option_python,
     option_run_in_parallel,
     option_skip_cleanup,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_verbose,
 )
@@ -367,12 +369,8 @@ def run_tests_in_parallel(
     show_default=True,
     envvar="PARALLEL_TEST_TYPES",
 )
[email protected](
-    "--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.",
@@ -416,6 +414,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,
@@ -436,6 +435,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 908843c224..84d0d2b6ec 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 @@ TESTING_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--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 99bc8c4d3c..b2240a42c9 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 f9a82064b8..5e8e50da61 100644
--- a/dev/breeze/src/airflow_breeze/utils/common_options.py
+++ b/dev/breeze/src/airflow_breeze/utils/common_options.py
@@ -601,3 +601,15 @@ option_eager_upgrade_additional_requirements = 
click.option(
     help="Optional additional requirements to upgrade eagerly to avoid 
backtracking "
     "(see `breeze ci find-backtracking-candidates`).",
 )
+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 df6047c322..b0a5697b18 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -600,6 +600,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")
@@ -647,6 +648,7 @@ DERIVE_ENV_VARIABLES_FROM_ATTRIBUTES = {
     "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 b15e25524a..09b6278bf9 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:8de3ed2645928e8f9f89c58f0ccd2a60
-shell:30a9271ff59a0fe756dda402cc165683
+shell:1e901a677a6df6ba1d64d3fe79b42587
 start-airflow:ff0f63e20b9ff454e5d3c7b9ba9080d7
 static-checks:d319b1c7972a6623bc8ee1b174cacb48
 testing:docker-compose-tests:0c810047fc66a0cfe91119e2d08b3507
 testing:helm-tests:8e491da2e01ebd815322c37562059d77
 testing:integration-tests:486e4d91449ecdb7630ef2a470d705a3
-testing:tests:3c202e65824e405269e78f58936980e0
-testing:68a089bc30e0e60f834f205df1e9f086
+testing:tests:b3b921fd5a7d3435a0ad34e90b75cb2f
+testing:13325e047fc32d9e40b51bfd15212a91
diff --git a/images/breeze/output_shell.svg b/images/breeze/output_shell.svg
index a8dd2ecd2e..7c8b47ed11 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 1709.1999999999998" 
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="1658.1999999999998" />
     </clipPath>
     <clipPath id="breeze-shell-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -234,9 +234,21 @@
 <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>
+<clipPath id="breeze-shell-line-65">
+    <rect x="0" y="1587.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-shell-line-66">
+    <rect x="0" y="1611.9" 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="1707.2" 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"/>
@@ -304,12 +316,16 @@
 </text><text class="breeze-shell-r5" x="0" y="1362" textLength="12.2" 
clip-path="url(#breeze-shell-line-55)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1362" textLength="12.2" 
clip-path="url(#breeze-shell-line-55)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1362" textLength="97.6" 
clip-path="url(#breeze-shell-line-55)">-package</text><text 
class="breeze-shell-r4" x="134.2" y="1362" textLength="85.4" 
clip-path="url(#breeze-shell-line-55)">-format</text><text class="breeze-sh 
[...]
 </text><text class="breeze-shell-r5" x="0" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-56)">│</text><text class="breeze-shell-r5" 
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
 cl [...]
 </text><text class="breeze-shell-r5" 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-r5" x="0" y="1435.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-58)">╭─</text><text class="breeze-shell-r5" 
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-r5" x="219.6" y="1435.2" textLength="1220" 
clip-path="url(#breeze-shell-line-58)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class [...]
-</text><text class="breeze-shell-r5" x="0" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r4" 
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 [...]
-</text><text class="breeze-shell-r5" x="0" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1484" textLength="48.8" 
clip-path="url(#breeze-shell-line-60)">-dry</text><text class="breeze-shell-r4" 
x="85.4" y="1484" textLength="48.8" 
clip-path="url(#breeze-shell-line-60)">-run</text><text class="breeze-shell-r6" 
 [...]
-</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">-</text><text class="breeze-shell-r4" 
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- [...]
-</text><text class="breeze-shell-r5" x="0" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">-</text><text class="breeze-shell-r4" 
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-shel [...]
-</text><text class="breeze-shell-r5" 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-r5" x="0" y="1435.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-58)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1435.2" textLength="500.2" 
clip-path="url(#breeze-shell-line-58)">&#160;Upgrading/downgrading&#160;selected&#160;packages&#160;</text><text
 class="breeze-shell-r5" x="524.6" y="1435.2" textLength="915" 
clip-path="url(#breeze-shell-line-58)">───────────────────────────────────────────────────────────────────────────</text><text
 c [...]
+</text><text class="breeze-shell-r5" x="0" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1459.6" textLength="97.6" 
clip-path="url(#breeze-shell-line-59)">-upgrade</text><text 
class="breeze-shell-r4" x="134.2" y="1459.6" textLength="61" 
clip-path="url(#breeze-shell-line-59)">-boto</text><text class="breez [...]
+</text><text class="breeze-shell-r5" x="0" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1484" textLength="122" 
clip-path="url(#breeze-shell-line-60)">-downgrade</text><text 
class="breeze-shell-r4" x="158.6" y="1484" textLength="134.2" 
clip-path="url(#breeze-shell-line-60)">-sqlalchemy</text><text class="bre [...]
+</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="1464" 
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-r5" x="0" y="1532.8" textLength="24.4" 
clip-path="url(#breeze-shell-line-62)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1532.8" textLength="195.2" 
clip-path="url(#breeze-shell-line-62)">&#160;Common&#160;options&#160;</text><text
 class="breeze-shell-r5" x="219.6" y="1532.8" textLength="1220" 
clip-path="url(#breeze-shell-line-62)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class [...]
+</text><text class="breeze-shell-r5" x="0" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-63)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1557.2" textLength="97.6" 
clip-path="url(#breeze-shell-line-63)">-verbose</text><text 
class="breeze-shell-r6" x="158.6" y="1557.2" textLength="24.4" 
clip-path="url(#breeze-shell-line-63)">-v</text><text class="breeze [...]
+</text><text class="breeze-shell-r5" x="0" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1581.6" textLength="48.8" 
clip-path="url(#breeze-shell-line-64)">-dry</text><text class="breeze-shell-r4" 
x="85.4" y="1581.6" textLength="48.8" 
clip-path="url(#breeze-shell-line-64)">-run</text><text class="breeze-sh [...]
+</text><text class="breeze-shell-r5" x="0" y="1606" textLength="12.2" 
clip-path="url(#breeze-shell-line-65)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1606" textLength="12.2" 
clip-path="url(#breeze-shell-line-65)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1606" textLength="85.4" 
clip-path="url(#breeze-shell-line-65)">-answer</text><text 
class="breeze-shell-r6" x="158.6" y="1606" textLength="24.4" 
clip-path="url(#breeze-shell-line-65)">-a</text><text class="breeze-shell-r2 
[...]
+</text><text class="breeze-shell-r5" x="0" y="1630.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-66)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1630.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-66)">-</text><text class="breeze-shell-r4" 
x="36.6" y="1630.4" textLength="61" 
clip-path="url(#breeze-shell-line-66)">-help</text><text 
class="breeze-shell-r6" x="158.6" y="1630.4" textLength="24.4" 
clip-path="url(#breeze-shell-line-66)">-h</text><text class="breeze-shel [...]
+</text><text class="breeze-shell-r5" x="0" y="1654.8" textLength="1464" 
clip-path="url(#breeze-shell-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r2" x="1464" y="1654.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-67)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_testing_tests.svg 
b/images/breeze/output_testing_tests.svg
index ec3da499fa..9cf14a8662 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 1489.6" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1514.0" 
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="1438.6" />
+      <rect x="0" y="0" width="1463.0" height="1463.0" />
     </clipPath>
     <clipPath id="breeze-testing-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -219,9 +219,12 @@
 <clipPath id="breeze-testing-tests-line-57">
     <rect x="0" y="1392.3" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-tests-line-58">
+    <rect x="0" y="1416.7" 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="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>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1512" 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"/>
@@ -282,14 +285,15 @@
 </text><text class="breeze-testing-tests-r5" x="0" y="1191.2" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">│</text><text 
class="breeze-testing-tests-r7" x="414.8" y="1191.2" textLength="1024.8" 
clip-path="url(#breeze-testing-tests-line-48)">(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;&
 [...]
 </text><text class="breeze-testing-tests-r5" x="0" y="1215.6" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">│</text><text 
class="breeze-testing-tests-r5" x="414.8" y="1215.6" textLength="1024.8" 
clip-path="url(#breeze-testing-tests-line-49)">[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;&#1
 [...]
 </text><text class="breeze-testing-tests-r5" x="0" y="1240" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-50)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1240" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-50)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1240" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-50)">-upgrade</text><text 
class="breeze-testing-tests-r4" x="134.2" y="1240" textLength="61" 
clip-path="url(#breez [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="1264.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1264.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-51)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1264.4" textLength="85.4" 
clip-path="url(#breeze-testing-tests-line-51)">-remove</text><text 
class="breeze-testing-tests-r4" x="122" y="1264.4" textLength="158.6" 
clip-path="ur [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="1288.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1288.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-52)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1288.8" textLength="61" 
clip-path="url(#breeze-testing-tests-line-52)">-skip</text><text 
class="breeze-testing-tests-r4" x="97.6" y="1288.8" textLength="244" 
clip-path="url(#br [...]
-</text><text class="breeze-testing-tests-r5" 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-r5" x="0" y="1337.6" 
textLength="24.4" clip-path="url(#breeze-testing-tests-line-54)">╭─</text><text 
class="breeze-testing-tests-r5" 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-r5" x="219.6" y="1337.6" textLength="1220" 
clip-path="url(#breeze-testing-tests-line-54)">──────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-55)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1362" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-55)">-</text><text 
class="breeze-testing-tests-r4" 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(#bre [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="1386.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-56)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1386.4" textLength="48.8" 
clip-path="url(#breeze-testing-tests-line-56)">-dry</text><text 
class="breeze-testing-tests-r4" x="85.4" y="1386.4" textLength="48.8" 
clip-path="url(# [...]
-</text><text class="breeze-testing-tests-r5" x="0" y="1410.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-57)">-</text><text 
class="breeze-testing-tests-r4" 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(# [...]
-</text><text class="breeze-testing-tests-r5" 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><text class="breeze-testing-tests-r5" x="0" y="1264.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1264.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-51)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1264.4" textLength="122" 
clip-path="url(#breeze-testing-tests-line-51)">-downgrade</text><text 
class="breeze-testing-tests-r4" x="158.6" y="1264.4" textLength="134.2" 
clip-path [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1288.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1288.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-52)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1288.8" textLength="85.4" 
clip-path="url(#breeze-testing-tests-line-52)">-remove</text><text 
class="breeze-testing-tests-r4" x="122" y="1288.8" textLength="158.6" 
clip-path="ur [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1313.2" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1313.2" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-53)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1313.2" textLength="61" 
clip-path="url(#breeze-testing-tests-line-53)">-skip</text><text 
class="breeze-testing-tests-r4" x="97.6" y="1313.2" textLength="244" 
clip-path="url(#br [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1337.6" 
textLength="1464" 
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-r5" x="0" y="1362" textLength="24.4" 
clip-path="url(#breeze-testing-tests-line-55)">╭─</text><text 
class="breeze-testing-tests-r5" x="24.4" y="1362" textLength="195.2" 
clip-path="url(#breeze-testing-tests-line-55)">&#160;Common&#160;options&#160;</text><text
 class="breeze-testing-tests-r5" x="219.6" y="1362" textLength="1220" 
clip-path="url(#breeze-testing-tests-line-55)">────────────────────────────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1386.4" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-56)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1386.4" textLength="97.6" 
clip-path="url(#breeze-testing-tests-line-56)">-verbose</text><text 
class="breeze-testing-tests-r6" x="158.6" y="1386.4" textLength="24.4" 
clip-path=" [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1410.8" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-57)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1410.8" textLength="48.8" 
clip-path="url(#breeze-testing-tests-line-57)">-dry</text><text 
class="breeze-testing-tests-r4" x="85.4" y="1410.8" textLength="48.8" 
clip-path="url(# [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1435.2" 
textLength="12.2" clip-path="url(#breeze-testing-tests-line-58)">│</text><text 
class="breeze-testing-tests-r4" x="24.4" y="1435.2" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-58)">-</text><text 
class="breeze-testing-tests-r4" x="36.6" y="1435.2" textLength="61" 
clip-path="url(#breeze-testing-tests-line-58)">-help</text><text 
class="breeze-testing-tests-r6" x="158.6" y="1435.2" textLength="24.4" 
clip-path="url(# [...]
+</text><text class="breeze-testing-tests-r5" x="0" y="1459.6" 
textLength="1464" 
clip-path="url(#breeze-testing-tests-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-testing-tests-r2" x="1464" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-testing-tests-line-59)">
 </text>
     </g>
     </g>
diff --git a/scripts/ci/docker-compose/_docker.env 
b/scripts/ci/docker-compose/_docker.env
index 2cd4bc0f7d..aa21804e9b 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 160e8feec0..3b7417eab5 100644
--- a/scripts/ci/docker-compose/base.yml
+++ b/scripts/ci/docker-compose/base.yml
@@ -85,6 +85,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 d66767fa02..f71a0e1e39 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 73b8a20deb..87e573d114 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -326,6 +326,22 @@ fi
 # Remove pytest.ini from the current directory if it exists. It has been 
removed from the source tree
 # but may still be present in the local directory if the user has old breeze 
image
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
+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
@@ -558,13 +574,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 367924d82d..26c8cb2e03 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


Reply via email to