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

potiuk pushed a commit to branch v3-4-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v3-4-test by this push:
     new b448b3075e2 [v3-4-test] Keep v3-4-test CI on SQLAlchemy 2.0 and 
type-check on 2.1 (#75231)
b448b3075e2 is described below

commit b448b3075e2d30116bfbb9504a161eebcc76b690
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Oct 20 18:45:18 2026 +0200

    [v3-4-test] Keep v3-4-test CI on SQLAlchemy 2.0 and type-check on 2.1 
(#75231)
    
    * [v3-4-test] Make airflow-core typing hold for SQLAlchemy 2.0 and 2.1 
(#74629)
    
    SQLAlchemy 2.1 turns Select/Row/Result into TypeVarTuple generics, so
    `Select[tuple[X]]` now means a one-column select of a tuple, and rows
    unpack to the real (possibly nullable) column types instead of Any.
    
    No parameterised `Select` spelling is valid on both versions, so helpers
    that only refine a select they receive are generic over it, and helpers
    that build their own select return an unparameterised `Select`. Nullable
    columns are narrowed with `is None` checks rather than cast; the pool and
    asset-event queries already exclude NULL there, while get_authorized_pools
    now skips pools whose name is NULL. The 12-column task instance row, beyond
    SQLAlchemy's typed select() overloads, is unpacked into locals declared
    with their column types.
    
    Type-checks with mypy on both SQLAlchemy 2.0.54 and 2.1.4.
    
    (cherry picked from commit 675b02a2f9b21b77777b1577b43e37dbf2513e37)
    Generated-by: Claude Opus 5
    
    * [v3-4-test] Cap SQLAlchemy below 2.1 and type models for 2.0 and 2.1
    
    The v3-4-test lock resolved SQLAlchemy 2.1.4, which snowflake-sqlalchemy 
cannot import and which broke mypy in the CI image. This ports the parts of 
#73822 that main uses for the same upgrade: the snowflake provider cap that 
keeps the workspace lock on SQLAlchemy 2.0.54, and the hybrid-expression typing 
in DagRun, DagModel and Backfill that holds on both versions.
    
    Generated-by: Claude Opus 5
    
    ---------
    
    Co-authored-by: Dev-iL <[email protected]>
---
 .../api_fastapi/auth/managers/base_auth_manager.py |   3 +-
 .../core_api/services/ui/dependencies.py           |   6 +-
 .../execution_api/routes/task_instances.py         |  20 +-
 .../src/airflow/jobs/scheduler_job_runner.py       |   2 +-
 airflow-core/src/airflow/models/backfill.py        |   5 +-
 airflow-core/src/airflow/models/dag.py             |   7 +-
 airflow-core/src/airflow/models/dagrun.py          |   4 +-
 airflow-core/src/airflow/models/dynamic_region.py  |  23 +-
 airflow-core/src/airflow/models/pool.py            |   2 +-
 .../src/airflow/models/task_coordinates.py         |   9 +-
 airflow-core/src/airflow/models/xcom.py            |   7 +-
 airflow-core/src/airflow/utils/sqlalchemy.py       |   3 +
 .../auth/managers/test_base_auth_manager.py        |  17 ++
 .../tests/unit/models/test_taskinstance.py         |   4 +-
 providers/snowflake/README.rst                     |   1 +
 providers/snowflake/docs/index.rst                 |   1 +
 providers/snowflake/pyproject.toml                 |   5 +
 uv.lock                                            | 248 +++++++++------------
 18 files changed, 197 insertions(+), 170 deletions(-)

diff --git 
a/airflow-core/src/airflow/api_fastapi/auth/managers/base_auth_manager.py 
b/airflow-core/src/airflow/api_fastapi/auth/managers/base_auth_manager.py
index c1d901a8bc8..77c0ef9a141 100644
--- a/airflow-core/src/airflow/api_fastapi/auth/managers/base_auth_manager.py
+++ b/airflow-core/src/airflow/api_fastapi/auth/managers/base_auth_manager.py
@@ -786,7 +786,8 @@ class BaseAuthManager(Generic[T], LoggingMixin, 
metaclass=ABCMeta):
         rows = session.execute(stmt).all()
         pools_by_team: dict[str | None, set[str]] = defaultdict(set)
         for pool_name, team_name in rows:
-            pools_by_team[team_name].add(pool_name)
+            if pool_name is not None:
+                pools_by_team[team_name].add(pool_name)
 
         pool_names: set[str] = set()
         for team_name, team_pool_names in pools_by_team.items():
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/services/ui/dependencies.py 
b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/dependencies.py
index b48a2480502..eb2e665e889 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/services/ui/dependencies.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/services/ui/dependencies.py
@@ -417,7 +417,9 @@ def get_data_dependencies(
             
select(TaskInletAssetReference.dag_id).where(TaskInletAssetReference.asset_id 
== asset_id),
             
select(DagScheduleAssetReference.dag_id).where(DagScheduleAssetReference.asset_id
 == asset_id),
         )
-        connected_dag_ids = 
set(session.scalars(select(connected_dag_ids_query.subquery().c.dag_id)))
+        connected_dag_ids: set[str] = set(
+            
session.scalars(select(connected_dag_ids_query.subquery().c.dag_id))
+        )
         if not connected_dag_ids & readable_dag_ids:
             return {"nodes": [], "edges": []}
 
@@ -631,6 +633,8 @@ def get_data_dependencies(
             .distinct()
         )
         for event_asset_id, source_dag_id, source_task_id in alias_events:
+            if source_dag_id is None or source_task_id is None:
+                continue
             if readable_dag_ids is not None and source_dag_id not in 
readable_dag_ids:
                 continue
             asset_node_id = f"asset:{event_asset_id}"
diff --git 
a/airflow-core/src/airflow/api_fastapi/execution_api/routes/task_instances.py 
b/airflow-core/src/airflow/api_fastapi/execution_api/routes/task_instances.py
index 4c7cd7f17cb..dcceb605b80 100644
--- 
a/airflow-core/src/airflow/api_fastapi/execution_api/routes/task_instances.py
+++ 
b/airflow-core/src/airflow/api_fastapi/execution_api/routes/task_instances.py
@@ -24,6 +24,7 @@ import itertools
 import json
 from collections import defaultdict
 from collections.abc import Callable, Collection, Iterator, Sequence
+from datetime import datetime
 from typing import Annotated, Any, NoReturn, cast
 from uuid import UUID
 
@@ -344,7 +345,7 @@ def ti_run(
         # backend.
 
         # However, do not clear it for deferral
-        xcom_keys = []
+        xcom_keys: list[str] = []
         if not ti.next_method:
             read = 
build_xcom_read_query(producer_ids=select(TI.id).where(TI.id == 
task_instance_id))
             entity = xcom_entity(read)
@@ -566,6 +567,19 @@ def ti_update_state(
         .with_for_update(of=TI)
         .execution_options(include_all_attempts=True)
     )
+    # A 12-column select exceeds SQLAlchemy's typed ``select()`` overloads, so 
the row is untyped.
+    previous_state: str | None
+    try_number: int
+    max_tries: int
+    dag_id: str
+    task_id: str
+    run_id: str
+    region_index: int
+    region_id: UUID
+    hostname: str | None
+    logical_date: datetime | None
+    owners: str | None
+    working_set: bool | None
     try:
         (
             previous_state,
@@ -580,7 +594,7 @@ def ti_update_state(
             logical_date,
             owners,
             working_set,
-        ) = session.execute(old).one()
+        ) = tuple(session.execute(old).one())
         log.debug(
             "Retrieved current task instance state",
             previous_state=previous_state,
@@ -1119,7 +1133,7 @@ def ti_skip_downstream(
         raise HTTPException(status.HTTP_400_BAD_REQUEST, str(error)) from error
     if not selects:
         return
-    selected_ids = set(session.scalars(union(*selects)))
+    selected_ids: set[UUID] = set(session.scalars(union(*selects)))
 
     # Don't overwrite tasks that are already executing or finished.
     # See: https://github.com/apache/airflow/issues/59378
diff --git a/airflow-core/src/airflow/jobs/scheduler_job_runner.py 
b/airflow-core/src/airflow/jobs/scheduler_job_runner.py
index 899632c277c..7729ca789e5 100644
--- a/airflow-core/src/airflow/jobs/scheduler_job_runner.py
+++ b/airflow-core/src/airflow/jobs/scheduler_job_runner.py
@@ -3596,7 +3596,7 @@ class SchedulerJobRunner(BaseJobRunner, LoggingMixin):
         count_result: int | None = session.scalar(statement)
         return count_result if count_result is not None else 0
 
-    previous_ti_metrics: dict[TaskInstanceState, dict[tuple[str, str, str], 
int]] = {}
+    previous_ti_metrics: dict[TaskInstanceState, dict[tuple[str, str, str | 
None], int]] = {}
 
     @provide_session
     def _emit_ti_metrics(self, *, session: Session = NEW_SESSION) -> None:
diff --git a/airflow-core/src/airflow/models/backfill.py 
b/airflow-core/src/airflow/models/backfill.py
index 8e74f3e7fab..742d7689b62 100644
--- a/airflow-core/src/airflow/models/backfill.py
+++ b/airflow-core/src/airflow/models/backfill.py
@@ -62,6 +62,7 @@ from airflow.utils.types import DagRunTriggeredByType, 
DagRunType
 
 if TYPE_CHECKING:
     from sqlalchemy.orm import Session
+    from sqlalchemy.sql.elements import ColumnElement
 
     from airflow.models.dagrun import DagRun
     from airflow.serialization.definitions.dag import SerializedDAG
@@ -218,9 +219,9 @@ class Backfill(Base):
         return None
 
     @duration.expression  # type: ignore[no-redef]
-    def duration(cls) -> Any:
+    def duration(cls: type[Backfill]) -> ColumnElement[Any]:
         @provide_session
-        def _get_dialect(*, session: Session = NEW_SESSION) -> str:
+        def _get_dialect(*, session: Session = NEW_SESSION) -> str | None:
             return get_dialect_name(session=session)
 
         dialect_name = _get_dialect()
diff --git a/airflow-core/src/airflow/models/dag.py 
b/airflow-core/src/airflow/models/dag.py
index a073155438d..814f6e74298 100644
--- a/airflow-core/src/airflow/models/dag.py
+++ b/airflow-core/src/airflow/models/dag.py
@@ -83,6 +83,7 @@ if TYPE_CHECKING:
 
     from dateutil.relativedelta import relativedelta
     from sqlalchemy.orm.state import InstanceState
+    from sqlalchemy.sql.elements import ColumnElement
 
     from airflow.sdk import Context
     from airflow.serialization.definitions.assets import (
@@ -650,15 +651,15 @@ class DagModel(Base):
         return self._dag_display_property_value or self.dag_id
 
     @dag_display_name.expression  # type: ignore[no-redef]
-    def dag_display_name(self) -> str:
+    def dag_display_name(cls: type[DagModel]) -> ColumnElement[Any]:
         """
         Expression part of the ``dag_display`` name hybrid property.
 
         :meta private:
         """
         return case(
-            (self._dag_display_property_value.is_not(None), 
self._dag_display_property_value),
-            else_=self.dag_id,
+            (cls._dag_display_property_value.is_not(None), 
cls._dag_display_property_value),
+            else_=cls.dag_id,
         )
 
     @classmethod
diff --git a/airflow-core/src/airflow/models/dagrun.py 
b/airflow-core/src/airflow/models/dagrun.py
index e052006b69e..fc116ab20bf 100644
--- a/airflow-core/src/airflow/models/dagrun.py
+++ b/airflow-core/src/airflow/models/dagrun.py
@@ -122,7 +122,7 @@ if TYPE_CHECKING:
     from pydantic import NonNegativeInt
     from sqlalchemy.engine import ScalarResult
     from sqlalchemy.orm import Session
-    from sqlalchemy.sql.elements import Case, ColumnElement
+    from sqlalchemy.sql.elements import ColumnElement
     from sqlalchemy.sql.selectable import Select
 
     from airflow.api_fastapi.execution_api.datamodels.taskinstance import (
@@ -585,7 +585,7 @@ class DagRun(Base, LoggingMixin):
 
     @duration.expression  # type: ignore[no-redef]
     @provide_session
-    def duration(cls, *, session: Session = NEW_SESSION) -> Case:
+    def duration(cls: type[DagRun], *, session: Session = NEW_SESSION) -> 
ColumnElement[Any]:
         dialect_name = get_dialect_name(session)
         if dialect_name == "mysql":
             return func.timestampdiff(text("SECOND"), cls.start_date, 
cls.end_date)
diff --git a/airflow-core/src/airflow/models/dynamic_region.py 
b/airflow-core/src/airflow/models/dynamic_region.py
index 494cd09a926..b2100d95734 100644
--- a/airflow-core/src/airflow/models/dynamic_region.py
+++ b/airflow-core/src/airflow/models/dynamic_region.py
@@ -21,7 +21,7 @@ import struct
 from collections.abc import Collection, Iterable, Iterator
 from datetime import datetime
 from functools import partial
-from typing import TYPE_CHECKING, Any
+from typing import TYPE_CHECKING, TypeVar
 from uuid import UUID
 
 import attrs
@@ -72,6 +72,11 @@ if TYPE_CHECKING:
     from sqlalchemy.sql.elements import ColumnElement
 
     from airflow.models.taskinstance import TaskInstance
+    from airflow.utils.sqlalchemy import UUIDSelect
+
+# Bound unparameterised: no ``Select[...]`` spelling accepts every arity on 
both SQLAlchemy 2.0 and 2.1.
+# TODO: parameterise the bound with the variadic Select once the minimum 
SQLAlchemy is 2.1.
+_SelectT = TypeVar("_SelectT", bound="Select")
 
 
 def is_regional(region_id: UUID, region_index: int) -> bool:
@@ -566,8 +571,8 @@ def loop_position(
 
 
 def build_loop_family_legs(
-    query: Select[Any], family_member: DynamicRegion, *, iteration: int | None 
= None
-) -> tuple[Select[Any], Select[Any]]:
+    query: _SelectT, family_member: DynamicRegion, *, iteration: int | None = 
None
+) -> tuple[_SelectT, _SelectT]:
     """
     Split ``query``, a selection from ``task_instance``, into the rows that 
belong to one loop family.
 
@@ -648,7 +653,7 @@ def _match_any(column, value: str | Collection[str]) -> 
ColumnElement[bool]:
 
 
 def _filter_producers(
-    query: Select,
+    query: _SelectT,
     *,
     dag_id: str,
     run_id: str,
@@ -658,7 +663,7 @@ def _filter_producers(
     region_id: UUID | None,
     region_index: int | None,
     top_level_only: bool,
-) -> Select:
+) -> _SelectT:
     """Push every coordinate predicate that does not need loop ancestry into 
SQL."""
     from airflow.models.taskinstance import TaskInstance
 
@@ -707,7 +712,7 @@ def _validate_producer_request(
 
 
 def _build_candidate_query(
-    query: Select[Any],
+    query: _SelectT,
     *,
     dag_id: str,
     run_id: str,
@@ -718,7 +723,7 @@ def _build_candidate_query(
     region_id: UUID | None,
     region_index: int | None,
     session: Session,
-) -> Select[Any] | CompoundSelect | None:
+) -> _SelectT | CompoundSelect | None:
     """
     Narrow ``query`` to the candidate producers of the caller's scope, or 
``None`` if there are none.
 
@@ -823,7 +828,7 @@ def select_current_producer_ids(
     region_id: UUID | None = None,
     region_index: int | None = None,
     session: Session,
-) -> Select[tuple[UUID]]:
+) -> UUIDSelect:
     """
     Select the ids of the live producers :func:`resolve_current_producers` 
would return.
 
@@ -928,7 +933,7 @@ def _build_pass_ownership_filter(
 
 def select_loop_producer_ids(
     *, dag_id: str, run_id: str, loop_node_id: str, task_id: str, is_mapped: 
bool, session: Session
-) -> Select[tuple[UUID]]:
+) -> UUIDSelect:
     """
     Select every live execution of ``task_id`` across all passes of the loop 
``loop_node_id``.
 
diff --git a/airflow-core/src/airflow/models/pool.py 
b/airflow-core/src/airflow/models/pool.py
index 3a2bc8f0922..e791704c95c 100644
--- a/airflow-core/src/airflow/models/pool.py
+++ b/airflow-core/src/airflow/models/pool.py
@@ -398,4 +398,4 @@ class Pool(Base):
         pool_names: list[str], *, session: Session = NEW_SESSION
     ) -> dict[str, str | None]:
         stmt = select(Pool.pool, 
Pool.team_name).where(Pool.pool.in_(pool_names))
-        return {pool: team_name for pool, team_name in session.execute(stmt)}
+        return {pool: team_name for pool, team_name in session.execute(stmt) 
if pool is not None}
diff --git a/airflow-core/src/airflow/models/task_coordinates.py 
b/airflow-core/src/airflow/models/task_coordinates.py
index 956823d8756..73c2f87ed8d 100644
--- a/airflow-core/src/airflow/models/task_coordinates.py
+++ b/airflow-core/src/airflow/models/task_coordinates.py
@@ -49,6 +49,7 @@ if TYPE_CHECKING:
     from sqlalchemy.sql.elements import ColumnElement
 
     from airflow.serialization.definitions.dag import SerializedDAG, 
SerializedOperator
+    from airflow.utils.sqlalchemy import UUIDSelect
 
 
 LOOP_GATE_OPERATOR = "LoopGateOperator"
@@ -363,7 +364,7 @@ class TaskCoordinateResolver:
         run_id: str,
         task_ids: Collection[str],
         slots: Collection[tuple[str, int]],
-    ) -> Select[tuple[UUID]]:
+    ) -> UUIDSelect:
         """Select, in one statement, the region-less task instances that the 
named tasks or slots address."""
         targets = []
         if task_ids:
@@ -732,7 +733,7 @@ class TaskCoordinateResolver:
 
     def select_skip_target_ids(
         self, *, caller: TaskInstance, task_id: str, map_indexes: int | None = 
None
-    ) -> Select[tuple[UUID]]:
+    ) -> UUIDSelect:
         """
         Select the task instance ids a skip request from ``caller`` reaches 
for ``task_id``.
 
@@ -767,7 +768,7 @@ class TaskCoordinateResolver:
             map_indexes=map_indexes,
         )
 
-    def _select_loop_producer_ids(self, request: _ProducerRequest) -> 
Select[tuple[UUID]]:
+    def _select_loop_producer_ids(self, request: _ProducerRequest) -> 
UUIDSelect:
         if TYPE_CHECKING:
             assert request.loop_node_id is not None
         return select_loop_producer_ids(
@@ -791,7 +792,7 @@ class TaskCoordinateResolver:
         map_indexes: int | Collection[int] | None = None,
         previous_iteration: bool = False,
         all_iterations: bool = False,
-    ) -> Select[tuple[UUID]]:
+    ) -> UUIDSelect:
         """Select the task instance ids :meth:`resolve` returns, without 
loading the producers."""
         if region_index is not None and region_id is None:
             raise ValueError("region_index requires an explicit producer 
region_id")
diff --git a/airflow-core/src/airflow/models/xcom.py 
b/airflow-core/src/airflow/models/xcom.py
index f563f65949a..b86ade0fa5e 100644
--- a/airflow-core/src/airflow/models/xcom.py
+++ b/airflow-core/src/airflow/models/xcom.py
@@ -68,6 +68,9 @@ if TYPE_CHECKING:
     from airflow.models.dagrun import DagRun
     from airflow.models.taskinstance import TaskInstance
 
+    # TODO: use Select[XComModel] once the minimum SQLAlchemy is 2.1; 2.0 uses 
Select[tuple[XComModel]].
+    XComModelSelect = Select
+
 
 XCOM_RETURN_KEY = "return_value"
 
@@ -328,7 +331,7 @@ class _XComOperations:
         include_prior_dates: bool = False,
         limit: int | None = None,
         try_number: int | None = None,
-    ) -> Select[tuple[XComModel]]:
+    ) -> XComModelSelect:
         """
         Composes a query to get one or more XCom entries.
 
@@ -624,7 +627,7 @@ def _reject_projection_write(mapper, connection, target):
     raise TypeError("XCom read projection is read-only")
 
 
-def build_xcom_read_query(*, producer_ids: Select, key: str | None = None) -> 
Select[tuple[XComModel]]:
+def build_xcom_read_query(*, producer_ids: Select, key: str | None = None) -> 
XComModelSelect:
     model = get_xcom_model()
     entity = aliased(model, _filter_rows(model.__table__, 
producer_ids=producer_ids, key=key))
     return select(entity).execution_options(populate_existing=True)
diff --git a/airflow-core/src/airflow/utils/sqlalchemy.py 
b/airflow-core/src/airflow/utils/sqlalchemy.py
index 966217a68d0..18c5da08214 100644
--- a/airflow-core/src/airflow/utils/sqlalchemy.py
+++ b/airflow-core/src/airflow/utils/sqlalchemy.py
@@ -52,6 +52,9 @@ if TYPE_CHECKING:
 
     from airflow.typing_compat import Self
 
+    # TODO: use Select[UUID] once the minimum SQLAlchemy is 2.1; 2.0 uses 
Select[tuple[UUID]].
+    UUIDSelect = Select
+
 
 log = logging.getLogger(__name__)
 
diff --git 
a/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py 
b/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py
index f25f4dbc9fd..49e3699f203 100644
--- 
a/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py
+++ 
b/airflow-core/tests/unit/api_fastapi/auth/managers/test_base_auth_manager.py
@@ -38,6 +38,7 @@ from 
airflow.api_fastapi.auth.managers.models.resource_details import (
 from airflow.api_fastapi.auth.tokens import JWTGenerator, JWTValidator
 from airflow.api_fastapi.common.types import MenuItem
 from airflow.exceptions import RemovedInAirflow4Warning
+from airflow.models.pool import Pool
 from airflow.models.team import Team
 
 from tests_common.test_utils.config import conf_vars
@@ -799,6 +800,22 @@ class TestBaseAuthManager:
         result = auth_manager.get_authorized_pools(user=user, session=session)
         assert result == expected
 
+    @pytest.mark.db_test
+    def test_get_authorized_pools_skips_null_names(self, auth_manager, 
session):
+        session.add_all(
+            [
+                Pool(pool=None, slots=1, include_deferred=False),
+                Pool(pool="authorized_pool", slots=1, include_deferred=False),
+            ]
+        )
+        session.flush()
+        auth_manager.is_authorized_pool = 
create_autospec(auth_manager.is_authorized_pool, return_value=True)
+
+        result = 
auth_manager.get_authorized_pools(user=Mock(spec=BaseAuthManagerUserTest), 
session=session)
+
+        assert None not in result
+        assert "authorized_pool" in result
+
     @pytest.mark.parametrize(
         ("authorized_uri_prefix", "rows", "expected"),
         [
diff --git a/airflow-core/tests/unit/models/test_taskinstance.py 
b/airflow-core/tests/unit/models/test_taskinstance.py
index 4a7721b3a41..d2bec4dc393 100644
--- a/airflow-core/tests/unit/models/test_taskinstance.py
+++ b/airflow-core/tests/unit/models/test_taskinstance.py
@@ -137,6 +137,8 @@ from tests_common.test_utils.taskinstance import (
 from unit.models import DEFAULT_DATE
 
 if TYPE_CHECKING:
+    from collections.abc import Sequence
+
     from tests_common.pytest_plugin import DagMaker
 
 pytestmark = [pytest.mark.db_test, pytest.mark.need_serialized_dag, 
pytest.mark.want_activate_assets]
@@ -650,7 +652,7 @@ class TestTaskInstance:
         )
 
         ti.run(session=session)
-        executor_configs = session.scalars(
+        executor_configs: Sequence[dict | None] = session.scalars(
             select(TaskInstance.executor_config).where(TaskInstance.dag_id == 
ti.dag_id)
         ).all()
         assert executor_configs == [{"foo": "bar"}]
diff --git a/providers/snowflake/README.rst b/providers/snowflake/README.rst
index d1e5c5a50af..a9cb1e91c25 100644
--- a/providers/snowflake/README.rst
+++ b/providers/snowflake/README.rst
@@ -67,6 +67,7 @@ PIP package                                 Version required
 ``pyOpenSSL``                               ``>=22.1.0``
 ``snowflake-connector-python``              ``>=3.17.0``
 ``snowflake-sqlalchemy``                    ``>=1.7.0``
+``sqlalchemy``                              ``>=1.4.54,<2.1``
 ``snowflake-snowpark-python``               ``>=1.17.0,<9999; python_version < 
"3.12"``
 ``snowflake-snowpark-python``               ``>=1.27.0,<9999; python_version 
>= "3.12" and python_version < "3.14"``
 ``setuptools``                              ``>=80.0.0,<9999``
diff --git a/providers/snowflake/docs/index.rst 
b/providers/snowflake/docs/index.rst
index 93c23845fcc..5e0b4914ce6 100644
--- a/providers/snowflake/docs/index.rst
+++ b/providers/snowflake/docs/index.rst
@@ -116,6 +116,7 @@ PIP package                                 Version required
 ``pyOpenSSL``                               ``>=22.1.0``
 ``snowflake-connector-python``              ``>=3.17.0``
 ``snowflake-sqlalchemy``                    ``>=1.7.0``
+``sqlalchemy``                              ``>=1.4.54,<2.1``
 ``snowflake-snowpark-python``               ``>=1.17.0,<9999; python_version < 
"3.12"``
 ``snowflake-snowpark-python``               ``>=1.27.0,<9999; python_version 
>= "3.12" and python_version < "3.14"``
 ``setuptools``                              ``>=80.0.0,<9999``
diff --git a/providers/snowflake/pyproject.toml 
b/providers/snowflake/pyproject.toml
index 84de0a45667..c8b362e0acf 100644
--- a/providers/snowflake/pyproject.toml
+++ b/providers/snowflake/pyproject.toml
@@ -77,6 +77,11 @@ dependencies = [
     # 3.17.0 is the first version with Workload Identity Federation 
(WORKLOAD_IDENTITY authenticator).
     "snowflake-connector-python>=3.17.0",
     "snowflake-sqlalchemy>=1.7.0",
+    # snowflake-sqlalchemy (up to 1.11.1) subclasses 
sqlalchemy.orm.context.ORMSelectCompileState, which
+    # SQLAlchemy 2.1 made private, so importing it fails; 2.0.0rc2 itself 
declares sqlalchemy<2.1.
+    # Remove the cap once snowflake-sqlalchemy supports SQLAlchemy 2.1;
+    # tracked at https://github.com/apache/airflow/issues/75118
+    "sqlalchemy>=1.4.54,<2.1",
     # The "<9999" is a hint to the pip resolver to resolve this requirement 
early,
     # can be removed when the pip resolver is improved
     "snowflake-snowpark-python>=1.17.0,<9999;python_version<'3.12'",
diff --git a/uv.lock b/uv.lock
index 08b385f2345..87956a6ee45 100644
--- a/uv.lock
+++ b/uv.lock
@@ -17,16 +17,16 @@ resolution-markers = [
     "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
     "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 
@@ -8205,6 +8205,7 @@ dependencies = [
     { name = "snowflake-snowpark-python", marker = "python_full_version < 
'3.14'" },
     { name = "snowflake-sqlalchemy", version = "1.11.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version < '3.14'" },
     { name = "snowflake-sqlalchemy", version = "2.0.0rc1", source = { registry 
= "https://pypi.org/simple"; }, marker = "python_full_version >= '3.14'" },
+    { name = "sqlalchemy" },
 ]
 
 [package.optional-dependencies]
@@ -8256,6 +8257,7 @@ requires-dist = [
     { name = "snowflake-snowpark-python", marker = "python_full_version < 
'3.12'", specifier = ">=1.17.0,<9999" },
     { name = "snowflake-snowpark-python", marker = "python_full_version >= 
'3.12' and python_full_version < '3.14'", specifier = ">=1.27.0,<9999" },
     { name = "snowflake-sqlalchemy", specifier = ">=1.7.0" },
+    { name = "sqlalchemy", specifier = ">=1.4.54,<2.1" },
 ]
 provides-extras = ["common-ai", "microsoft-azure", "openlineage"]
 
@@ -12197,16 +12199,16 @@ version = "1.3.1"
 source = { registry = "https://pypi.org/simple"; }
 resolution-markers = [
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 dependencies = [
@@ -12769,16 +12771,16 @@ resolution-markers = [
     "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
     "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/0f/59/e19834834cb01a32febfbb0f8a23a9088088f5d45991824ff2bc3b5e8acb/filelock-3.32.7.tar.gz";,
 hash = 
"sha256:37b8a3d9811b0f9aef7e5ec5c71bb320de52df51e6ca9bcd6f5ad81187660da7", size 
= 225154, upload-time = "2026-09-16T00:24:20.907Z" }
@@ -13178,12 +13180,12 @@ resolution-markers = [
     "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
     "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
 ]
 dependencies = [
@@ -13428,16 +13430,16 @@ resolution-markers = [
     "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
     "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 dependencies = [
@@ -16663,16 +16665,16 @@ resolution-markers = [
     "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
     "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 dependencies = [
@@ -18468,16 +18470,16 @@ version = "3.6.1"
 source = { registry = "https://pypi.org/simple"; }
 resolution-markers = [
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz";,
 hash = 
"sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size 
= 2517025, upload-time = "2025-12-08T17:02:39.908Z" }
@@ -22955,16 +22957,16 @@ version = "1.17.1"
 source = { registry = "https://pypi.org/simple"; }
 resolution-markers = [
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 dependencies = [
@@ -23435,16 +23437,16 @@ resolution-markers = [
     "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
     "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 dependencies = [
@@ -23573,16 +23575,16 @@ resolution-markers = [
     "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
     "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 dependencies = [
@@ -23630,12 +23632,12 @@ version = "2.10"
 source = { registry = "https://pypi.org/simple"; }
 resolution-markers = [
     "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/71/c3/1b817965ac12dc002d7c9cd7dfffdd7d4fbf9b45763ef2ffe7b86ee94670/soupsieve-2.10.tar.gz";,
 hash = 
"sha256:49e9380d7d2905463583bafe285e818c7366a9ed7b3aee221c1ac79c905d8bc0", size 
= 124337, upload-time = "2026-09-24T02:36:35.048Z" }
@@ -23678,16 +23680,16 @@ version = "9.0.4"
 source = { registry = "https://pypi.org/simple"; }
 resolution-markers = [
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
     "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
     "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
 dependencies = [
@@ -23999,84 +24001,50 @@ wheels = [
 
 [[package]]
 name = "sqlalchemy"
-version = "2.1.4"
+version = "2.0.54"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
+    { name = "greenlet", marker = "platform_machine == 'AMD64' or 
platform_machine == 'WIN32' or platform_machine == 'aarch64' or 
platform_machine == 'amd64' or platform_machine == 'ppc64le' or 
platform_machine == 'win32' or platform_machine == 'x86_64'" },
     { name = "typing-extensions" },
 ]
-sdist = { url = 
"https://files.pythonhosted.org/packages/1f/44/311bac6b6ef81e4dfd0287d04900108b1f5c00c9761dd3c0a2b7b9d0f86b/sqlalchemy-2.1.4.tar.gz";,
 hash = 
"sha256:7bd7ad604487daa7eab8716471c29a7185f17b5287ce73bb7bc79fea050d8cfd", size 
= 10544216, upload-time = "2026-10-07T17:33:59.116Z" }
-wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/18/cd/264493ea522b887ac71949d442ef6a49ca04504e1090b427e878a71d5bb2/sqlalchemy-2.1.4-cp311-cp311-macosx_11_0_arm64.whl";,
 hash = 
"sha256:a6d147c31e189541ae7cd990482c4f960f9e8abce186551225fa355856dbf1a5", size 
= 2463376, upload-time = "2026-10-07T18:17:21.503Z" },
-    { url = 
"https://files.pythonhosted.org/packages/59/16/1dbc3674709e945d113cfe0f652431cfeda0aa5999c0737444e7e4a416f8/sqlalchemy-2.1.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:55072780d1aae84dea443ce27edeb745f6cc4d19ad89416abbb6b49712080e7c", size 
= 4628615, upload-time = "2026-10-07T18:37:37.947Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ec/24/0640dfb48fde362b83eaa122691457cb9a13f51d50cd6064ddcfba667c71/sqlalchemy-2.1.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:343a0493a81278bfe30be1ec81214a55f2f44aaa4662d230be359ab2aa18cc2a", size 
= 4650872, upload-time = "2026-10-07T18:24:42.632Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ea/e4/5aec21a9e6ffadc919854fef1cd92b6f699ee204811e78ae1b1f9733da7e/sqlalchemy-2.1.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl";,
 hash = 
"sha256:8080022e101afb17565dc5a358a165ff4a20cd97b20b4db49ebed66315b3c733", size 
= 4380816, upload-time = "2026-10-07T18:59:39.313Z" },
-    { url = 
"https://files.pythonhosted.org/packages/e7/2b/7aaf2b01d4d9c7168a55e0c318ab494ab436b434ebdfd4977fee5fabddf9/sqlalchemy-2.1.4-cp311-cp311-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:948dff080b5ac00c8e63bf9e59fa70e386cca1476f55c672a72b6ec12e5cdb05", size 
= 4566541, upload-time = "2026-10-07T18:37:40.136Z" },
-    { url = 
"https://files.pythonhosted.org/packages/e3/61/3e4df04dd09d1db05ea31a2d7dc015aed26e33fefaca610eecbfe9b8d26b/sqlalchemy-2.1.4-cp311-cp311-musllinux_1_2_riscv64.whl";,
 hash = 
"sha256:12642e105b4e0cb2ca8428037368c1cbcded7b9d0344174607174d82b700e1eb", size 
= 4377842, upload-time = "2026-10-07T18:59:42.612Z" },
-    { url = 
"https://files.pythonhosted.org/packages/53/4f/c983249adefed608b0cdc13bffe43a47a032316548e81bfdb4b6282a5b56/sqlalchemy-2.1.4-cp311-cp311-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:976bd3fecfcfa58d69eab67e76325f564ed775aa0c0accf138ae17324b461431", size 
= 4621091, upload-time = "2026-10-07T18:24:44.894Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ee/90/257469b63c8cfad892b796c54a1392b3dfef93ee9273af5a8f49065d77ce/sqlalchemy-2.1.4-cp311-cp311-win32.whl";,
 hash = 
"sha256:e2ace725a430e5b303fc3c422196966328ce77fb4fd053ad85572b46ed5fb71a", size 
= 2379577, upload-time = "2026-10-07T18:24:56.929Z" },
-    { url = 
"https://files.pythonhosted.org/packages/3d/53/eae7fc135ac36ebc6385e87975ed5672d6311f0350f0358f38906a877f2c/sqlalchemy-2.1.4-cp311-cp311-win_amd64.whl";,
 hash = 
"sha256:3c998d70e60fc95e93e5971395818c50f8a34396a6352075256fefac6b5cf81b", size 
= 2430336, upload-time = "2026-10-07T18:24:58.751Z" },
-    { url = 
"https://files.pythonhosted.org/packages/81/fb/73b7ad29f65d9a114a3b42fe10ddf654bc360855dd29455381d4c7c34f97/sqlalchemy-2.1.4-cp311-cp311-win_arm64.whl";,
 hash = 
"sha256:d045e63095828d2f1fd84d499936e6791522c15c390373fc755f118e4040393a", size 
= 2394934, upload-time = "2026-10-07T18:22:34.762Z" },
-    { url = 
"https://files.pythonhosted.org/packages/49/5e/cb5b078e007340661b010fa8bd31ce27468f88e09b35266544df4e0c52ca/sqlalchemy-2.1.4-cp312-cp312-macosx_11_0_arm64.whl";,
 hash = 
"sha256:f953be9ba26039a24a5205c65d33518b608ce6f4f0f4e9b9c14eaf42a10dfc52", size 
= 2466469, upload-time = "2026-10-07T18:17:24.049Z" },
-    { url = 
"https://files.pythonhosted.org/packages/b1/98/44e2fdc5bc053dae559bf4f4eb7967ceecbad162299ecfc8de2edc3fcbe7/sqlalchemy-2.1.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:1ac64fce94c5b389062d2e3806db5dc780447591e0dfd5ead218c884f0703f2e", size 
= 4668213, upload-time = "2026-10-07T18:37:42.294Z" },
-    { url = 
"https://files.pythonhosted.org/packages/08/25/ed2262f964687b06f10c2c98b2dc9c9ed211f7cc11702879969a9ac217e4/sqlalchemy-2.1.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:3e5045fb6aadbb0f978ab9b9d8822f7b7a97d2281814e7d13d791155664eace3", size 
= 4720857, upload-time = "2026-10-07T18:24:46.842Z" },
-    { url = 
"https://files.pythonhosted.org/packages/4d/d4/fab64c61d5d22ddbb077afd1e6b29b498bdacdf6406a03f53566e7e01686/sqlalchemy-2.1.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl";,
 hash = 
"sha256:e3a026436c51f296aa1d01243909a3b76490950e927824b10899a083cc26e7c3", size 
= 4369351, upload-time = "2026-10-07T18:59:45.483Z" },
-    { url = 
"https://files.pythonhosted.org/packages/d9/e4/33413f0fafbcf3b332320aac2c1e40f3b4f17e56359a9474cb10de4bee8b/sqlalchemy-2.1.4-cp312-cp312-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:71040390ef01c85e9d26e5c83cb0c5942dcc8725c49186430af160ce2f54234d", size 
= 4591496, upload-time = "2026-10-07T18:37:44.433Z" },
-    { url = 
"https://files.pythonhosted.org/packages/bb/65/19821440cbd5c93da053d627b3e402eff11ff252bfae37700645b3c155a4/sqlalchemy-2.1.4-cp312-cp312-musllinux_1_2_riscv64.whl";,
 hash = 
"sha256:07c60abaffb980b7382f2c75be8a5279c2b5df2626a0f5d751dd942799bf3b5c", size 
= 4362379, upload-time = "2026-10-07T18:59:48.278Z" },
-    { url = 
"https://files.pythonhosted.org/packages/01/e3/168a0f93efd6ec40f59645a7e45ab08918e0bc8ecf07656e4ca09acdcc30/sqlalchemy-2.1.4-cp312-cp312-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:a577e2127e52b0fe2bc54c73abb375a20ffe6f59fbc5568ccafc233f5bfcf8ef", size 
= 4667997, upload-time = "2026-10-07T18:24:48.72Z" },
-    { url = 
"https://files.pythonhosted.org/packages/54/79/0a852ef65864acd8d577d7aa6f67146167382bd6faee7a7586b9e6e28275/sqlalchemy-2.1.4-cp312-cp312-win32.whl";,
 hash = 
"sha256:6c79e0c824d51c586757ecd342160bbdede9010df04bb71b9bbfffd5c7b6ee29", size 
= 2376664, upload-time = "2026-10-07T18:25:00.637Z" },
-    { url = 
"https://files.pythonhosted.org/packages/27/b9/a5934263bb1d712f743289ca224ab3b87e3570ac157802291e37ab85d365/sqlalchemy-2.1.4-cp312-cp312-win_amd64.whl";,
 hash = 
"sha256:dffa69d2f3ba1933c1c1882dbef8fb3231b33eb19263e8b8c5cea24995071f06", size 
= 2429357, upload-time = "2026-10-07T18:25:02.565Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a5/fa/a2323d81384ff214aa189057b7455b63623e66f28208b982e86c3cb042f5/sqlalchemy-2.1.4-cp312-cp312-win_arm64.whl";,
 hash = 
"sha256:e30524ae24e31d83e1b5f734862882c442f4158e3566f2c5f5e9bd3c659bb517", size 
= 2388756, upload-time = "2026-10-07T18:22:36.025Z" },
-    { url = 
"https://files.pythonhosted.org/packages/dc/e4/23174288ed2c03d6dbd5dfacd69e28303ee95f49642a8ed0544932999fb6/sqlalchemy-2.1.4-cp313-cp313-macosx_11_0_arm64.whl";,
 hash = 
"sha256:70006e9e6157200b795beeee04bd5cb15bccb40a14de595eb9f5dcf5945ed244", size 
= 2460507, upload-time = "2026-10-07T18:04:40.044Z" },
-    { url = 
"https://files.pythonhosted.org/packages/9f/ac/254fadc98bfd600445b976e81c6d777b08a728a415c3b77a8c8d35b89a83/sqlalchemy-2.1.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:3341ddc430733cd961bc064889f42712a0b4056733a21c83176842aad67d12a6", size 
= 4594505, upload-time = "2026-10-07T18:16:58.768Z" },
-    { url = 
"https://files.pythonhosted.org/packages/83/6f/ac7beddc57c9c87bd77bc1c158fcbcdc20822f1873bf33ea3480d04e865f/sqlalchemy-2.1.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:98f7a4bfeaed3722804f737ae2bd4077b35e57d6f4531fe612bac8160cda5acd", size 
= 4647364, upload-time = "2026-10-07T18:34:51.721Z" },
-    { url = 
"https://files.pythonhosted.org/packages/0a/82/fc3891f261c4738a8b90cfdd805fe292d1af3b77f680a63b7349304c74e5/sqlalchemy-2.1.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl";,
 hash = 
"sha256:ec5d079935f67febe0ab8a3a203ad591b99508adc34ae0027f696dcb20373537", size 
= 4311619, upload-time = "2026-10-07T18:38:44.002Z" },
-    { url = 
"https://files.pythonhosted.org/packages/b0/1a/160c1320ab20e764a29721dc3fe7c31af34e291c652dca875d1ca6022b9a/sqlalchemy-2.1.4-cp313-cp313-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:3d675b0856b6703b29d023517a4c19fecfbb55214ff5c72cd813527e40aed9b4", size 
= 4518031, upload-time = "2026-10-07T18:17:05.615Z" },
-    { url = 
"https://files.pythonhosted.org/packages/30/2c/15a204333896e5dc63cb089ea20ca3ebc3c892bedf9fa00cc1a65e20d7b5/sqlalchemy-2.1.4-cp313-cp313-musllinux_1_2_riscv64.whl";,
 hash = 
"sha256:a0bb9ee6a38cb36240dc88da11888348f61506047be54de3f09496c3b0ead6f5", size 
= 4312818, upload-time = "2026-10-07T18:38:46.541Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a6/55/5e78d288f198598f278b4b7baef42f18e039b14b1e1045e9df3cf571300d/sqlalchemy-2.1.4-cp313-cp313-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:61a2c48771cf314b6613d327c795902bbc0eb6d6169deb23b35004ba6ad6cc0d", size 
= 4608584, upload-time = "2026-10-07T18:34:53.69Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ab/f6/e83b93ecc6e6528623fd7aa2af27ff0660d22354b78fe6ccad03f9ecbd9f/sqlalchemy-2.1.4-cp313-cp313-win32.whl";,
 hash = 
"sha256:3fd608a06bafa768ad5711df4e17eb058bdc490e9df7d39b12a90947471e8712", size 
= 2373880, upload-time = "2026-10-07T18:22:11.722Z" },
-    { url = 
"https://files.pythonhosted.org/packages/8f/46/afb02975023db6aa4b8608177c2fae17d0b435d9cbfcb5df4fa6e65a8078/sqlalchemy-2.1.4-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:b756d74527c56a7e4cfae297f7930c1d75bdf4b23f214c8c13779746d28060cb", size 
= 2424430, upload-time = "2026-10-07T18:22:23.688Z" },
-    { url = 
"https://files.pythonhosted.org/packages/21/e5/76dc82d59186b98b27589b33b01175c0d49512679276170271d9384418e2/sqlalchemy-2.1.4-cp313-cp313-win_arm64.whl";,
 hash = 
"sha256:a64d54015233f824f171009977bfbb6b08bd0347b700cf17cb047ffb94c4148f", size 
= 2385057, upload-time = "2026-10-07T18:11:48.248Z" },
-    { url = 
"https://files.pythonhosted.org/packages/43/b0/6675a01f4e6215e0a809d28a800953294ab31370fe8c4bb3eb9e28c0b5a6/sqlalchemy-2.1.4-cp314-cp314-macosx_11_0_arm64.whl";,
 hash = 
"sha256:7a2f6164c0527cd8fc4cea79a5c9d8369ffee417b8ba444a42342f36b91deb75", size 
= 2463645, upload-time = "2026-10-07T18:04:41.615Z" },
-    { url = 
"https://files.pythonhosted.org/packages/7e/24/4630a4009ea08a0769d5ff6517c7fc978f6a63eba32e08c44b98c284d7e4/sqlalchemy-2.1.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:6929a11ad26a91a4efd891c1252b373c2e88f056910b83ec6030ed3f2cbcb734", size 
= 4587911, upload-time = "2026-10-07T18:17:12.512Z" },
-    { url = 
"https://files.pythonhosted.org/packages/0e/02/953686f44448b92cc628245687a242799b6eb11ef30ad2bc7adacd51986d/sqlalchemy-2.1.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:14528d37d7d46a92f2a483f188f7fecd86cdd789254a0412b960c9fc5e9efd6d", size 
= 4617539, upload-time = "2026-10-07T18:34:55.826Z" },
-    { url = 
"https://files.pythonhosted.org/packages/13/23/a44288ab4fa12e51c9d390e7d798d70a45669ddcbddc9dd9b5948eb1aa3f/sqlalchemy-2.1.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl";,
 hash = 
"sha256:d2cb669c6bd1f19caf51db6e3c4fdd4cbb76f9db3ef81c3aeb5e288d9bae101b", size 
= 4310883, upload-time = "2026-10-07T18:38:50.265Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a3/39/1c441ac015767f619a9e6cc306905bb042f94b84f2a1e930e989e9c6e209/sqlalchemy-2.1.4-cp314-cp314-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:63dc25b21fd9a41dc09b7aada4b3b0d97cf4b6414f74bced6ac45326bc799ac9", size 
= 4516511, upload-time = "2026-10-07T18:17:14.368Z" },
-    { url = 
"https://files.pythonhosted.org/packages/2f/b9/f54ea5ccb27d9a712d90d1617050bee761df25dc1fb5e0b7d2aa867deb51/sqlalchemy-2.1.4-cp314-cp314-musllinux_1_2_riscv64.whl";,
 hash = 
"sha256:308f96d24e773d64609a2a0d1161a068f9f6e9165523bc4e07aa9c45f0c4213f", size 
= 4312314, upload-time = "2026-10-07T18:38:53.249Z" },
-    { url = 
"https://files.pythonhosted.org/packages/df/9a/c1e39287ee988e4c2e25c619959b8fb15b297734be040653fe85b57517ee/sqlalchemy-2.1.4-cp314-cp314-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:93b9416b9011a3b7689a933e04ac9f61d15686b6cb1948ebc1f41467153116c3", size 
= 4577833, upload-time = "2026-10-07T18:34:57.829Z" },
-    { url = 
"https://files.pythonhosted.org/packages/41/78/5f1ae1911d2b20ccdb39ee522118533a4b5262b6e5e06bbcbb1ebd1f4617/sqlalchemy-2.1.4-cp314-cp314-win32.whl";,
 hash = 
"sha256:89db94855287fdac98d74595cf13ea59fbffa608d6400ff972b0fd4c036d873f", size 
= 2380724, upload-time = "2026-10-07T18:22:25.374Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ca/93/4dfa4ce15d082011fb94e06e7c6b4c2957a3f0ddeb8fe9b89d007bc058d7/sqlalchemy-2.1.4-cp314-cp314-win_amd64.whl";,
 hash = 
"sha256:080f8d853aac5bb5620f0ae6f46527397cf18dce0ec2b478b478469ef3cae2c4", size 
= 2431689, upload-time = "2026-10-07T18:22:27.144Z" },
-    { url = 
"https://files.pythonhosted.org/packages/1a/c4/6f6c29eaf459c4c2d9b7d24e300bab32043f8f8a936df863f3b886b5564a/sqlalchemy-2.1.4-cp314-cp314-win_arm64.whl";,
 hash = 
"sha256:64d41be1dd88f184de1931f0173f4827122a1b49fd1150656641200c0bdf640c", size 
= 2396106, upload-time = "2026-10-07T18:11:49.528Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a5/e9/48f851411665e394f60c669d1f9494d660f5f1fe46e275f9615cfc812a98/sqlalchemy-2.1.4-cp314-cp314t-macosx_11_0_arm64.whl";,
 hash = 
"sha256:84272f329c15081a1e09b4a7261118b4e8a547f43e00fca98e55bbdf19eff3be", size 
= 2503038, upload-time = "2026-10-07T18:19:41.094Z" },
-    { url = 
"https://files.pythonhosted.org/packages/41/ed/bf83068bda4051d7fd719c14cefc15d8466ef1e3656b9f4401b0509b11e0/sqlalchemy-2.1.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:7b3f58bd26fc010ea28976d401845e4e6ce02e1b7c0288b3ea9c9a3c396f0bcc", size 
= 4919623, upload-time = "2026-10-07T18:16:45.399Z" },
-    { url = 
"https://files.pythonhosted.org/packages/56/de/57eb70d56b70d22a9360d658b195834ecfdeff7a7bc5c2e3a7fa7a8f7823/sqlalchemy-2.1.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:82d728075d42bd457d09655cf22e99d772a648c6f67e86743a4f05b7d063ca18", size 
= 4830238, upload-time = "2026-10-07T18:37:04.468Z" },
-    { url = 
"https://files.pythonhosted.org/packages/70/3d/c410e9e79a53fff4c04444da609fed6404868d250f11fe8bc53d827bfb0e/sqlalchemy-2.1.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl";,
 hash = 
"sha256:0970394ec5d9e397aafc5bc5fa2b7f8b58cb191f2703006b19a96ef4bf00b8d9", size 
= 4508380, upload-time = "2026-10-07T18:38:44.277Z" },
-    { url = 
"https://files.pythonhosted.org/packages/1f/c3/01b93821ba35b5b162e79c613279d960a120767694f656da1c1374dd3ed3/sqlalchemy-2.1.4-cp314-cp314t-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:6005f2f5fcd67fdd721446128e6a2a1d18f77387a604fbd26b0006a086b33096", size 
= 4775311, upload-time = "2026-10-07T18:16:47.724Z" },
-    { url = 
"https://files.pythonhosted.org/packages/c7/88/0b40754e4d851d33548792062c23467a3d8dc07f2eff90cb19e4c404fb4c/sqlalchemy-2.1.4-cp314-cp314t-musllinux_1_2_riscv64.whl";,
 hash = 
"sha256:0e01a3e199ae219381c4889993c5584b1b905fffe6830f639adb6770036a8913", size 
= 4508558, upload-time = "2026-10-07T18:38:47.857Z" },
-    { url = 
"https://files.pythonhosted.org/packages/d3/2f/3916954eca5596d9e93fccd2ec0e45fd8c65981debac0ec4617639ded6ba/sqlalchemy-2.1.4-cp314-cp314t-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:22129e7d00ac66b291840c4dc83a9c497456ab5bffa682dcbfdc2356f9e49e5a", size 
= 4767114, upload-time = "2026-10-07T18:37:06.792Z" },
-    { url = 
"https://files.pythonhosted.org/packages/6b/d6/6a29716aec6ae17cd77e27b5e0dedc68cf9068594f2b601806c1d146427a/sqlalchemy-2.1.4-cp314-cp314t-win32.whl";,
 hash = 
"sha256:bc33d3e59d4e84b8866cc9ba13732585e37212dbe3542cb09f232682b36f47a5", size 
= 2439584, upload-time = "2026-10-07T18:22:44.434Z" },
-    { url = 
"https://files.pythonhosted.org/packages/34/79/2f0b33647d2d26f098269096c1864c0b4e81095354cdedb95192647f47cd/sqlalchemy-2.1.4-cp314-cp314t-win_amd64.whl";,
 hash = 
"sha256:346d144e8912ae087b10d3c2081657cb634728600693eee6dbb71d7eb4768101", size 
= 2507217, upload-time = "2026-10-07T18:22:46.176Z" },
-    { url = 
"https://files.pythonhosted.org/packages/93/e5/869c1ac0a21e17e4617b6a7828b50320bedb7074b6d67aec59299be5cdba/sqlalchemy-2.1.4-cp314-cp314t-win_arm64.whl";,
 hash = 
"sha256:3e5de57c71b3460e2ca6137e82cd3cb8c9f711f301f50d5c77156fdb9c822999", size 
= 2425329, upload-time = "2026-10-07T18:12:20.595Z" },
-    { url = 
"https://files.pythonhosted.org/packages/2b/8e/a082a165b473dae45d2f2f79be15f5c405ac579830c64253efbf04695177/sqlalchemy-2.1.4-cp315-cp315-macosx_11_0_arm64.whl";,
 hash = 
"sha256:418786f05387ddb66ee683a1d016c5a8d9bf7be921e6ee8f285c7b6ac961a731", size 
= 2463572, upload-time = "2026-10-07T18:11:12.053Z" },
-    { url = 
"https://files.pythonhosted.org/packages/d1/35/74db254005ecb384533973b157ba1fc3fe5bc41a5bc6e0500ab8369c49e6/sqlalchemy-2.1.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:283914efed30e4d44301e36ac90ad048570538b8a70f072fe01578d9b205d09c", size 
= 4591740, upload-time = "2026-10-07T18:01:00.314Z" },
-    { url = 
"https://files.pythonhosted.org/packages/70/81/5cadd72b0c26b6ee7c1e6950cb9f0cfc383246a842314a1b2a87f455db25/sqlalchemy-2.1.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:3d2eacdbeb990b80235763860923c60a8393745b66f7149a734980c65896da72", size 
= 4627040, upload-time = "2026-10-07T18:09:24.836Z" },
-    { url = 
"https://files.pythonhosted.org/packages/8e/78/aed93cc373f61b57625e1f9f84bbf12358e32e935e64fa098f3a446e1203/sqlalchemy-2.1.4-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl";,
 hash = 
"sha256:e43fca5fdd5f34a3f8c54107a3648d3139de8bbf596a189f3f0de94bd84949bb", size 
= 4333103, upload-time = "2026-10-07T18:33:48.275Z" },
-    { url = 
"https://files.pythonhosted.org/packages/e0/31/ecc6bbd365671cdc512a59d42afa7c34b2833a8d841754918ae3f62d36dd/sqlalchemy-2.1.4-cp315-cp315-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:2e1b5343d315b10a4a71da481729f66f830a561595e02b61e8a5a65d658325ac", size 
= 4519962, upload-time = "2026-10-07T18:01:02.268Z" },
-    { url = 
"https://files.pythonhosted.org/packages/58/58/9f8f6157c2252aefe73f4a0b3859413bb720d14321aa7f367c691949aaf8/sqlalchemy-2.1.4-cp315-cp315-musllinux_1_2_riscv64.whl";,
 hash = 
"sha256:42c37c06adcecf444e8c981f7e9237a41bdd445c83da0df9e08b4ad958becbbc", size 
= 4331935, upload-time = "2026-10-07T18:33:50.334Z" },
-    { url = 
"https://files.pythonhosted.org/packages/97/de/a4ae4b95d17607004f01e9a085fb221087c557bbad77a3d87d5d0a5fd8bc/sqlalchemy-2.1.4-cp315-cp315-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:bab7f51d38766d6a64da2b41976f1b3f9cc2ff37d3f2f63bdbac876199f3a48e", size 
= 4589275, upload-time = "2026-10-07T18:09:26.872Z" },
-    { url = 
"https://files.pythonhosted.org/packages/65/27/56f69293a01279ac0e6077b8c358eb0f1c2afc6aa17428414a86c8871042/sqlalchemy-2.1.4-cp315-cp315-win32.whl";,
 hash = 
"sha256:1541ba5bf0f232cd61f9ef3df78c93977c72ba6031506a0e6d057b2a3ddb76e9", size 
= 2380494, upload-time = "2026-10-07T18:04:25.637Z" },
-    { url = 
"https://files.pythonhosted.org/packages/2c/7c/ff7e29f95996ed49b950afd531b89e7c8d15addb41735643d07090550090/sqlalchemy-2.1.4-cp315-cp315-win_amd64.whl";,
 hash = 
"sha256:596a95611c217cb19c21f02f43c637cb507cab71dcf0467c5c7d98fcdd703007", size 
= 2431760, upload-time = "2026-10-07T18:04:27.275Z" },
-    { url = 
"https://files.pythonhosted.org/packages/76/8c/4eaa4978760cd632093ea272e7c4f88223619202f5481f897e67d4377409/sqlalchemy-2.1.4-cp315-cp315-win_arm64.whl";,
 hash = 
"sha256:0d1ca95e42ce3c18818f170b741d30a33b292c6f6b9a202ffd717e28fc99b8c7", size 
= 2395807, upload-time = "2026-10-07T18:30:54.962Z" },
-    { url = 
"https://files.pythonhosted.org/packages/be/7b/b806fbfc61ade37c4f3aecec0874c345fb297b56a3743116dcefa3e4700d/sqlalchemy-2.1.4-cp315-cp315t-macosx_11_0_arm64.whl";,
 hash = 
"sha256:0f672ed6972164fec94a8f0b21dcf8545080d0727866335fb8adf9f4764ce6ec", size 
= 2499195, upload-time = "2026-10-07T18:19:42.835Z" },
-    { url = 
"https://files.pythonhosted.org/packages/fc/ba/4f9fba8340222f09287e936d7b76e6911a4e507c7d6373ada770e8f697d5/sqlalchemy-2.1.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:72e3fa41d1fdab87d4e88bbdd69c9522e2795549fbe7b07bcf4ae9ec175f4b11", size 
= 4896914, upload-time = "2026-10-07T18:16:53.18Z" },
-    { url = 
"https://files.pythonhosted.org/packages/55/34/c4aeec7bee453badd8b0e02c2021a13bd70ef01038303d05326e99f595b6/sqlalchemy-2.1.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:cb2cb98d056e63e353ed697750004e07c79b054d73059ba3184ca3bb07296bea", size 
= 4846593, upload-time = "2026-10-07T18:37:08.766Z" },
-    { url = 
"https://files.pythonhosted.org/packages/82/54/6dd8504364e5f5efd328e98fea963e5a2e978ff8dcba70d95231314f82a9/sqlalchemy-2.1.4-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl";,
 hash = 
"sha256:1d66fdcc5506e0f8bb8d3f4f95125220a7cd6c46e8b1762750f01e9639973dd8", size 
= 4494821, upload-time = "2026-10-07T18:38:51.166Z" },
-    { url = 
"https://files.pythonhosted.org/packages/df/42/dc584c098bce29578fd0611cd6f36830e06b4dd2505d3020a0b592f4cf08/sqlalchemy-2.1.4-cp315-cp315t-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:81f802c96dbf96e59c6982fa1b87da7868920fb0c27b9b81e560a62f57c2ccfb", size 
= 4752545, upload-time = "2026-10-07T18:16:55.711Z" },
-    { url = 
"https://files.pythonhosted.org/packages/8c/41/69a70c1419bea97e80f65ce09f4f626df464752b276f4f3d69ff6fbf2325/sqlalchemy-2.1.4-cp315-cp315t-musllinux_1_2_riscv64.whl";,
 hash = 
"sha256:acf8982c70471a68aa90d1aba08b48860c55b3357ec84ccb0f09368ead2ce099", size 
= 4494093, upload-time = "2026-10-07T18:38:54.37Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ef/bd/d296c2223e8417b350db215d94dcd344bc0dfe9deb7d810a21f7d8cd0b14/sqlalchemy-2.1.4-cp315-cp315t-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:778094c83e36c430756a7e1a1ac66fc3cffb2c6a1067958fe6b920abcec7bc5a", size 
= 4771973, upload-time = "2026-10-07T18:37:10.93Z" },
-    { url = 
"https://files.pythonhosted.org/packages/13/4c/c3a10d9da10e4e60808ffd1825547b383c0d7ca9e56d15cdae47c04e752e/sqlalchemy-2.1.4-cp315-cp315t-win32.whl";,
 hash = 
"sha256:963348422b22f760e9462e56bc32bf4d95d224cc5b8c79a3c6e3b786d3d2a2b2", size 
= 2436383, upload-time = "2026-10-07T18:22:48.162Z" },
-    { url = 
"https://files.pythonhosted.org/packages/51/de/8045d4ad1fd3a66c3b9bb576f3734c86015e19ae2f1617af92eb63cf9e58/sqlalchemy-2.1.4-cp315-cp315t-win_amd64.whl";,
 hash = 
"sha256:fba3500e170d25f581e053009edeb0b158116084d91d465de218718d336b67c3", size 
= 2502237, upload-time = "2026-10-07T18:22:50.196Z" },
-    { url = 
"https://files.pythonhosted.org/packages/6b/4b/245e2315d331cc15765a2373e068445fbd28eb63beb23ea862828808c0bf/sqlalchemy-2.1.4-cp315-cp315t-win_arm64.whl";,
 hash = 
"sha256:0a9a464bc360856b7ea9bf8aa26aab92ca115dd08149cb0e004063d5db13584b", size 
= 2420917, upload-time = "2026-10-07T18:12:21.876Z" },
-    { url = 
"https://files.pythonhosted.org/packages/f7/62/dbf11a262f6fbb41390cab2d8e47a30ec0961018b68201607b599dd489f5/sqlalchemy-2.1.4-py3-none-any.whl";,
 hash = 
"sha256:0b96edcc2cd60fe1e35f67a46f4eb076e57297841b9eae949ac5f196593f00a7", size 
= 2054935, upload-time = "2026-10-07T18:01:16.403Z" },
+sdist = { url = 
"https://files.pythonhosted.org/packages/29/9c/271aa905cf2964f841371a97f3e63ab692bf51b4423d0491e67bc7f64037/sqlalchemy-2.0.54.tar.gz";,
 hash = 
"sha256:baa8521e8ee9f24e75dfc7aaabc08020e551ef0d48d7c3e3536f5cddf277586b", size 
= 9969559, upload-time = "2026-09-15T21:06:57.337Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/76/bf/7339b18ef05c03335a32f077e450c8040eab0c952c2964e32cd889eafc22/sqlalchemy-2.0.54-cp311-cp311-macosx_11_0_arm64.whl";,
 hash = 
"sha256:7d03084f3352dd92048cb19c71d90f116d076c9c7937e0ebc7752c4685de6d38", size 
= 2187776, upload-time = "2026-09-15T22:32:35.535Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9b/bb/3b6f5f3f51582d63af4c88b1e70da7888e936dee6b86a237b7633fb3f216/sqlalchemy-2.0.54-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:92622fbbda1b1fe1632f3402a6e516a93c0e41d9158839c6b3dfb12117f26b72", size 
= 3428952, upload-time = "2026-09-15T22:40:14.441Z" },
+    { url = 
"https://files.pythonhosted.org/packages/77/d5/ffd6b59795ebec81d582ad866f71ec7c73d356768e0442c6a07bba61c40c/sqlalchemy-2.0.54-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:5800ddea045c2c860ef1d359a07a3066c7c0c426f45e3abc3874e116cb3c6937", size 
= 3428566, upload-time = "2026-09-15T22:35:33.739Z" },
+    { url = 
"https://files.pythonhosted.org/packages/63/ff/1f0bffb0653b30711e2445a48968eff9412b4e5bf0870f1e72e8a69595ef/sqlalchemy-2.0.54-cp311-cp311-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:1019abef05a4b5eafc8eae6fb483167fa28a4dbe5f518d577b744f31a5276a37", size 
= 3377697, upload-time = "2026-09-15T22:40:16.494Z" },
+    { url = 
"https://files.pythonhosted.org/packages/97/76/774906be0d41cc4a14ecfbc015112fb7d0a3f1c3393f2c179d10388f8f0b/sqlalchemy-2.0.54-cp311-cp311-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:b67749f7da3985a529cefbb1474783cb91ef44371cb9713630bade3de908760d", size 
= 3402966, upload-time = "2026-09-15T22:35:35.726Z" },
+    { url = 
"https://files.pythonhosted.org/packages/cd/bb/1d7fe50ace612bf342d3440d8b09544746949120326c3dc487cfc2592fba/sqlalchemy-2.0.54-cp311-cp311-win32.whl";,
 hash = 
"sha256:2f61a70b3b82e2ec7ad6a4f2301422b9ca93ff06917983e41317bcae878bddf6", size 
= 2142297, upload-time = "2026-09-15T21:25:19.917Z" },
+    { url = 
"https://files.pythonhosted.org/packages/d6/49/18fe80f64b1f6bcd422e649e40a78031f8624b2fde22ca54e950dfa6e25a/sqlalchemy-2.0.54-cp311-cp311-win_amd64.whl";,
 hash = 
"sha256:1d887fbd5d248e250807bd801e697fc73e3b44866ce5f093dbc90512e75bde25", size 
= 2169222, upload-time = "2026-09-15T21:25:21.114Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c6/30/75504fd1d70458000e85a3e772333dd0fbf80254b0dc4d41c99922e4d112/sqlalchemy-2.0.54-cp312-cp312-macosx_11_0_arm64.whl";,
 hash = 
"sha256:ffba7eb2d67c7505e82a0902aa854d8824b74c28a183820d6a8bd3cfd0f812c2", size 
= 2187596, upload-time = "2026-09-15T22:32:37.031Z" },
+    { url = 
"https://files.pythonhosted.org/packages/a2/3d/5dfbb9528a391186a99986daecc5cbe003f34408dee91db8f5cdcf917040/sqlalchemy-2.0.54-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:63cae7210fea9899e0bf35c1f1ae55d3ddd9c6d47cae8b6b43d945afa79dd65b", size 
= 3448745, upload-time = "2026-09-15T22:40:18.168Z" },
+    { url = 
"https://files.pythonhosted.org/packages/d9/93/34fdc4a4faced77037a6b3ba1db1acd92e9bd12c21e229b327edd1d3e881/sqlalchemy-2.0.54-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:68d994e9b0d0423a02a20039631fa6fcbb7fa829a992f7605025774940305d19", size 
= 3466644, upload-time = "2026-09-15T22:35:37.7Z" },
+    { url = 
"https://files.pythonhosted.org/packages/66/68/4beab40ae60ac3d679dbbb46bc0d2bb277013264a0bde37ecaf4b6780e98/sqlalchemy-2.0.54-cp312-cp312-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:3de32cc6721eb42c3aad35bcfb244bb7a18f66c00f3582aae6281d6287a339b5", size 
= 3401519, upload-time = "2026-09-15T22:40:19.907Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e5/df/a24757e3249b1c7c1c5f0317666d16a8ab901ba239819ecef29eb4ed172e/sqlalchemy-2.0.54-cp312-cp312-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:d31a2bc06a854ee52dd86b455be4df7c750b28817e2d1b884e31fff126c4fd7b", size 
= 3432590, upload-time = "2026-09-15T22:35:39.434Z" },
+    { url = 
"https://files.pythonhosted.org/packages/d9/0c/69559e3d90d200fbfe9c44aff39a9ff4e506b1a3e9557a203d69df721244/sqlalchemy-2.0.54-cp312-cp312-win32.whl";,
 hash = 
"sha256:32de6deded25e8b9b11d07428d496ff24dfbc882b8e990c177266948cb5f3d9e", size 
= 2140825, upload-time = "2026-09-15T21:25:22.444Z" },
+    { url = 
"https://files.pythonhosted.org/packages/d9/10/4a0f7113664c2877906db143709c52ddbd28a88e4d51f0b520bc30048ba7/sqlalchemy-2.0.54-cp312-cp312-win_amd64.whl";,
 hash = 
"sha256:d65f8ca742ef1e1e14bc417ef59dc2ddf207a7b66b30cfdc6152447314e030cf", size 
= 2170005, upload-time = "2026-09-15T21:25:23.885Z" },
+    { url = 
"https://files.pythonhosted.org/packages/aa/1c/021ccd7a838425f52e67c02edc541e8d53be8a27a103e684e14b18aac17b/sqlalchemy-2.0.54-cp313-cp313-macosx_11_0_arm64.whl";,
 hash = 
"sha256:b374e3bc91e246a942592a98ba6a23be76fff21358b00546ac8c0ebc0fd0e00b", size 
= 2184259, upload-time = "2026-09-15T22:28:59.153Z" },
+    { url = 
"https://files.pythonhosted.org/packages/74/8f/f95de908a4af7ac3a6925cdcb837a93274f608925a0fbc786df38811bccf/sqlalchemy-2.0.54-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:31d5458672a6f72db2c087f4a5098b3c8503ea0254186ff29205d63afa9401a4", size 
= 3398792, upload-time = "2026-09-15T22:29:35.218Z" },
+    { url = 
"https://files.pythonhosted.org/packages/84/26/bd327a1a6be223e438c98ac8faf299307d83797225a81f3b209607a9fd98/sqlalchemy-2.0.54-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:cad78d04254967bdbcccbed5e631d88fe4868530946ab0929aa45e9032849518", size 
= 3417562, upload-time = "2026-09-15T22:40:32.637Z" },
+    { url = 
"https://files.pythonhosted.org/packages/4b/b1/f13a8fe8e8e167d8e65484b91b827897b8a5ca1efd7ba6e87a5f63412fed/sqlalchemy-2.0.54-cp313-cp313-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:48611087a75d26d798003645c688c7d3cfc26b89dbe4a2c568d6b378d330deae", size 
= 3349138, upload-time = "2026-09-15T22:29:36.729Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b1/b7/5fd58f03281a74c57f02f509433e1be58a79d9f5b0e14020e665e0dcb614/sqlalchemy-2.0.54-cp313-cp313-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:d6adf80277372a89910a0f3ccfe960b846d279dc55b366dd5c5ec07f41c84758", size 
= 3382943, upload-time = "2026-09-15T22:40:34.587Z" },
+    { url = 
"https://files.pythonhosted.org/packages/4b/73/e29fa88dfc809857a55e6523911d345d00cab4adf87032c21ade8874223c/sqlalchemy-2.0.54-cp313-cp313-win32.whl";,
 hash = 
"sha256:264460333ed0b177cbb1956355d0ee4e0cab83fb415c934ce12a25db2e7be39c", size 
= 2138931, upload-time = "2026-09-15T22:42:51.801Z" },
+    { url = 
"https://files.pythonhosted.org/packages/89/9d/885e7491836f3dad368c74f0d5b93551d37b0ec66c9e8753240ee988308f/sqlalchemy-2.0.54-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:cf89e92bf0d4204a6afcc17af27b9271ed9c7e34e17d6f80c085d431ea4a1747", size 
= 2166496, upload-time = "2026-09-15T22:42:53.603Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ab/c0/4a6503c9d22d6d00a5631082ab1484222ecf7d573db791e0f53161bf7745/sqlalchemy-2.0.54-cp314-cp314-macosx_11_0_arm64.whl";,
 hash = 
"sha256:abd6b21bc58e91c1932eb5d6d7f1bd44a551dfec7b6a7f517c3638ccd67233a0", size 
= 2185899, upload-time = "2026-09-15T22:29:00.581Z" },
+    { url = 
"https://files.pythonhosted.org/packages/12/28/f4424f618bd1f373761a32a821d53ce2c257350e9894bae9b968cb03d8fd/sqlalchemy-2.0.54-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:5417322b3c025dd82918725d3bf09ec105fac95efc195722b8b06e1d9c381139", size 
= 3394763, upload-time = "2026-09-15T22:29:38.131Z" },
+    { url = 
"https://files.pythonhosted.org/packages/59/d2/7f0c77f8e042cb5f28275fea29c3080b4ac6fd4b3fdd7f59ff1ef3e28c11/sqlalchemy-2.0.54-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:6f84099e4b04a5c2d44500a2a8302eee5af4bc6fee63e8c6e9cf6786e747280e", size 
= 3402800, upload-time = "2026-09-15T22:40:36.509Z" },
+    { url = 
"https://files.pythonhosted.org/packages/af/32/3eaa930bcf71d17a72587081d2706a5fb97ab3f11a7e0fb838f581f7cff1/sqlalchemy-2.0.54-cp314-cp314-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:a0956dc754d3884da7fe60097110ec7a8a105d26afa2f0844468f4b1598c6912", size 
= 3341469, upload-time = "2026-09-15T22:29:39.682Z" },
+    { url = 
"https://files.pythonhosted.org/packages/eb/cc/cddb6cbd4408e5c55b3bf722be26b9d3b54d42509f901b7ecc15debd3d1f/sqlalchemy-2.0.54-cp314-cp314-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:87ba8834318b0d8dc94fc6f405d071b5c08be32a6c3fd68107fd6952ee949615", size 
= 3373232, upload-time = "2026-09-15T22:40:39.181Z" },
+    { url = 
"https://files.pythonhosted.org/packages/34/2f/9c2aa5efc642b7f3b985d13565cd1a5e78856e079ef3022796fea5180498/sqlalchemy-2.0.54-cp314-cp314-win32.whl";,
 hash = 
"sha256:842540e4382472f23c79589995752648d14696a8200d0807ed8c5c59c92ade44", size 
= 2142018, upload-time = "2026-09-15T22:42:55.118Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e2/0b/3594f1f51769feb3022d686135dc5d8682a12345ed15ae61d0c0ca42cbee/sqlalchemy-2.0.54-cp314-cp314-win_amd64.whl";,
 hash = 
"sha256:f4e8f955d13af83fb4e35c3472e5377ee22d3445eada1e5e48199588edb69835", size 
= 2169220, upload-time = "2026-09-15T22:42:56.727Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c3/a5/c211a9a7af83222509519407e16a4db760c6df3d03be69ebc5414d465321/sqlalchemy-2.0.54-cp314-cp314t-macosx_11_0_arm64.whl";,
 hash = 
"sha256:ca05f4e7852cf48083b0cf157e4f9504b7068780422a50fa82f45353b8c5e14a", size 
= 2208458, upload-time = "2026-09-15T22:30:05.718Z" },
+    { url = 
"https://files.pythonhosted.org/packages/cb/2e/490ad7b3731116cb48ba170f7722eaa99a89707193e54389ca84b7ad55af/sqlalchemy-2.0.54-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:18a8b6417cbb7b735cf91c2b59453c2a554cefa0a8d7bd15aa35740739410d77", size 
= 3660585, upload-time = "2026-09-15T22:36:06.649Z" },
+    { url = 
"https://files.pythonhosted.org/packages/eb/25/15dfe6814847eeda773bd58ab6cf42a94b0176e5cf25a578fc1165777160/sqlalchemy-2.0.54-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:4e55a0b96a1577a1e108c91ccdeeb9cd92768f28ce206597311c3bf6d6423abd", size 
= 3624442, upload-time = "2026-09-15T22:36:38.377Z" },
+    { url = 
"https://files.pythonhosted.org/packages/aa/19/724d0a6a2fb2a86ff2d6008e581c258f722d9b7d8e52adc7b79085febdd4/sqlalchemy-2.0.54-cp314-cp314t-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:69cab115c40fd02c5a22c68e4ee630fa6ef9a1650f1de944419aab1f7096fc4f", size 
= 3562972, upload-time = "2026-09-15T22:36:08.581Z" },
+    { url = 
"https://files.pythonhosted.org/packages/49/bb/9df1bd81c2f2d000cf5e7a1b1a9b331468a3aab939ad983355e701fa42b2/sqlalchemy-2.0.54-cp314-cp314t-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:e08397c6c42f53b2488acde9108b8bfefd52d7afd1bf2f03d2ffcab7a204aceb", size 
= 3576479, upload-time = "2026-09-15T22:36:40.272Z" },
+    { url = 
"https://files.pythonhosted.org/packages/df/c0/b5775465d3b89061d7c46057c31c56ff8fb6c509550b2b0c6570ffc248b3/sqlalchemy-2.0.54-cp314-cp314t-win32.whl";,
 hash = 
"sha256:b9086b8ad48280ef6a7ba68262d5e44f7db1c4cb1973e8cdae8a9f467ae66f51", size 
= 2174794, upload-time = "2026-09-15T22:31:45.925Z" },
+    { url = 
"https://files.pythonhosted.org/packages/77/f8/296c2e46b4ccd3f29b00b954ef2f195dde32f98e352ed21de1d292cedc0d/sqlalchemy-2.0.54-cp314-cp314t-win_amd64.whl";,
 hash = 
"sha256:b67c1744e453af833667fc1b84de07adb4a64f3536ef52a8ec5ac2b941d43970", size 
= 2211942, upload-time = "2026-09-15T22:31:47.368Z" },
+    { url = 
"https://files.pythonhosted.org/packages/24/a1/bd5e3e99bc9c8863b51ac5b9b03008a7f2da8c6b59695992f5c654e1265b/sqlalchemy-2.0.54-py3-none-any.whl";,
 hash = 
"sha256:7e33a631ab1474f8fe6b910bd1a07b7b8009c4c78cdd3fb18001b03e3bc2e1d2", size 
= 1958015, upload-time = "2026-09-15T22:24:22.95Z" },
 ]
 
 [package.optional-dependencies]

Reply via email to