diff --git a/homeassistant/components/recorder/db_schema.py b/homeassistant/components/recorder/db_schema.py
index d1a2405406e3f3815d3bd0bb35b7abec99506038..bc8fcd1310ed884664d3e96be09dc5712fd5009b 100644
--- a/homeassistant/components/recorder/db_schema.py
+++ b/homeassistant/components/recorder/db_schema.py
@@ -203,11 +203,11 @@ UINT_32_TYPE = BigInteger().with_variant(
     "mariadb",
 )
 JSON_VARIANT_CAST = Text().with_variant(
-    postgresql.JSON(none_as_null=True),  # type: ignore[no-untyped-call]
+    postgresql.JSON(none_as_null=True),
     "postgresql",
 )
 JSONB_VARIANT_CAST = Text().with_variant(
-    postgresql.JSONB(none_as_null=True),  # type: ignore[no-untyped-call]
+    postgresql.JSONB(none_as_null=True),
     "postgresql",
 )
 DATETIME_TYPE = (
diff --git a/homeassistant/components/recorder/manifest.json b/homeassistant/components/recorder/manifest.json
index 3ba36ab86c0eef4dd64540fb4c0a307f793fc0c9..f5336e2a85b8748dccf4ce9ba4e51edfee082d27 100644
--- a/homeassistant/components/recorder/manifest.json
+++ b/homeassistant/components/recorder/manifest.json
@@ -7,7 +7,7 @@
   "iot_class": "local_push",
   "quality_scale": "internal",
   "requirements": [
-    "SQLAlchemy==2.0.38",
+    "SQLAlchemy==2.0.39",
     "fnv-hash-fast==1.4.0",
     "psutil-home-assistant==0.0.1"
   ]
diff --git a/homeassistant/components/recorder/migration.py b/homeassistant/components/recorder/migration.py
index 3aa12f2b1f972ea2a867e529326ed710fd3f93d7..c5eea0f708803b0861c8187ea82b6c1e168277f3 100644
--- a/homeassistant/components/recorder/migration.py
+++ b/homeassistant/components/recorder/migration.py
@@ -9,7 +9,7 @@ from dataclasses import dataclass, replace as dataclass_replace
 from datetime import timedelta
 import logging
 from time import time
-from typing import TYPE_CHECKING, Any, cast, final
+from typing import TYPE_CHECKING, Any, TypedDict, cast, final
 from uuid import UUID
 
 import sqlalchemy
@@ -712,6 +712,11 @@ def _modify_columns(
                 raise
 
 
+class _FKAlterDict(TypedDict):
+    old_fk: ForeignKeyConstraint
+    columns: list[str]
+
+
 def _update_states_table_with_foreign_key_options(
     session_maker: Callable[[], Session], engine: Engine
 ) -> None:
@@ -729,7 +734,7 @@ def _update_states_table_with_foreign_key_options(
 
     inspector = sqlalchemy.inspect(engine)
     tmp_states_table = Table(TABLE_STATES, MetaData())
-    alters = [
+    alters: list[_FKAlterDict] = [
         {
             "old_fk": ForeignKeyConstraint(
                 (), (), name=foreign_key["name"], table=tmp_states_table
@@ -755,14 +760,14 @@ def _update_states_table_with_foreign_key_options(
         with session_scope(session=session_maker()) as session:
             try:
                 connection = session.connection()
-                connection.execute(DropConstraint(alter["old_fk"]))  # type: ignore[no-untyped-call]
+                connection.execute(DropConstraint(alter["old_fk"]))
                 for fkc in states_key_constraints:
                     if fkc.column_keys == alter["columns"]:
                         # AddConstraint mutates the constraint passed to it, we need to
                         # undo that to avoid changing the behavior of the table schema.
                         # https://github.com/sqlalchemy/sqlalchemy/blob/96f1172812f858fead45cdc7874abac76f45b339/lib/sqlalchemy/sql/ddl.py#L746-L748
                         create_rule = fkc._create_rule  # noqa: SLF001
-                        add_constraint = AddConstraint(fkc)  # type: ignore[no-untyped-call]
+                        add_constraint = AddConstraint(fkc)
                         fkc._create_rule = create_rule  # noqa: SLF001
                         connection.execute(add_constraint)
             except (InternalError, OperationalError):
@@ -800,7 +805,7 @@ def _drop_foreign_key_constraints(
         with session_scope(session=session_maker()) as session:
             try:
                 connection = session.connection()
-                connection.execute(DropConstraint(drop))  # type: ignore[no-untyped-call]
+                connection.execute(DropConstraint(drop))
             except (InternalError, OperationalError):
                 _LOGGER.exception(
                     "Could not drop foreign constraints in %s table on %s",
@@ -845,7 +850,7 @@ def _restore_foreign_key_constraints(
         # undo that to avoid changing the behavior of the table schema.
         # https://github.com/sqlalchemy/sqlalchemy/blob/96f1172812f858fead45cdc7874abac76f45b339/lib/sqlalchemy/sql/ddl.py#L746-L748
         create_rule = constraint._create_rule  # noqa: SLF001
-        add_constraint = AddConstraint(constraint)  # type: ignore[no-untyped-call]
+        add_constraint = AddConstraint(constraint)
         constraint._create_rule = create_rule  # noqa: SLF001
         try:
             _add_constraint(session_maker, add_constraint, table, column)
diff --git a/homeassistant/components/sql/manifest.json b/homeassistant/components/sql/manifest.json
index 2b00a5b0d65140511ad54bb7ced8831ce13dd67c..37b5dc2b647aae8a71e7522266888e2d303ac50b 100644
--- a/homeassistant/components/sql/manifest.json
+++ b/homeassistant/components/sql/manifest.json
@@ -6,5 +6,5 @@
   "config_flow": true,
   "documentation": "https://www.home-assistant.io/integrations/sql",
   "iot_class": "local_polling",
-  "requirements": ["SQLAlchemy==2.0.38", "sqlparse==0.5.0"]
+  "requirements": ["SQLAlchemy==2.0.39", "sqlparse==0.5.0"]
 }
diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt
index d9c761e6341f634fb0051a2047d4541b25b4e5e8..24ce6e23e861a9ac6eabe50f840cc55c2a43312f 100644
--- a/homeassistant/package_constraints.txt
+++ b/homeassistant/package_constraints.txt
@@ -61,7 +61,7 @@ PyTurboJPEG==1.7.5
 PyYAML==6.0.2
 requests==2.32.3
 securetar==2025.2.1
-SQLAlchemy==2.0.38
+SQLAlchemy==2.0.39
 standard-aifc==3.13.0
 standard-telnetlib==3.13.0
 typing-extensions>=4.12.2,<5.0
diff --git a/pyproject.toml b/pyproject.toml
index 09c14cbde6942f9b43009bf3189756604634c448..8e3fe4e25a7efd44b10f3f0f24b51d0084802571 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -67,7 +67,7 @@ dependencies    = [
     "PyYAML==6.0.2",
     "requests==2.32.3",
     "securetar==2025.2.1",
-    "SQLAlchemy==2.0.38",
+    "SQLAlchemy==2.0.39",
     "standard-aifc==3.13.0",
     "standard-telnetlib==3.13.0",
     "typing-extensions>=4.12.2,<5.0",
diff --git a/requirements.txt b/requirements.txt
index 6ae428d542039de3ace1d4a6ab091f2d075fea18..13c58f6cd71818410dbc145813afcb9019b8d516 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -39,7 +39,7 @@ python-slugify==8.0.4
 PyYAML==6.0.2
 requests==2.32.3
 securetar==2025.2.1
-SQLAlchemy==2.0.38
+SQLAlchemy==2.0.39
 standard-aifc==3.13.0
 standard-telnetlib==3.13.0
 typing-extensions>=4.12.2,<5.0
diff --git a/requirements_all.txt b/requirements_all.txt
index 0c057e8f537b41212fa7fb345468553f12116d70..b40ab7110c4e9a5a66c3b3bd3b94a1091092b3f3 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -116,7 +116,7 @@ RtmAPI==0.7.2
 
 # homeassistant.components.recorder
 # homeassistant.components.sql
-SQLAlchemy==2.0.38
+SQLAlchemy==2.0.39
 
 # homeassistant.components.tami4
 Tami4EdgeAPI==3.0
diff --git a/requirements_test_all.txt b/requirements_test_all.txt
index e2dca4383ed3d15ed5055a9967c1f2b410e18120..eef5fc03173f62e1a9d6ebb3ae247be51b22bc5c 100644
--- a/requirements_test_all.txt
+++ b/requirements_test_all.txt
@@ -110,7 +110,7 @@ RtmAPI==0.7.2
 
 # homeassistant.components.recorder
 # homeassistant.components.sql
-SQLAlchemy==2.0.38
+SQLAlchemy==2.0.39
 
 # homeassistant.components.tami4
 Tami4EdgeAPI==3.0