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

vincbeck pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 06ca8a9c248 Remove query obj from providers fab (#53953)
06ca8a9c248 is described below

commit 06ca8a9c248b69112b3a916f2458b1be02bbc07b
Author: Pratiksha <[email protected]>
AuthorDate: Sat Aug 30 00:16:58 2025 +0530

    Remove query obj from providers fab (#53953)
    
    * remove session.query from tests
    
    * remove session.query from fab/src
    
    * fix errors
    
    * Removed unnecessary comments code and applied small fixes
    
    * resolved conflict and removed session.query from it
    
    * remove .query()
    
    * fix static checks
    
    * fix static checks
    
    * fix import error
    
    * include fab provider in pre-commit check
    
    * remove query obj from test_user_endpoint
---
 .pre-commit-config.yaml                            |  1 +
 .../fab/auth_manager/security_manager/override.py  | 89 ++++++++++++----------
 .../test_role_and_permission_endpoint.py           |  5 +-
 .../api_endpoints/test_user_endpoint.py            | 33 ++++----
 .../fab/auth_manager/schemas/test_user_schema.py   |  7 +-
 .../tests/unit/fab/auth_manager/test_security.py   | 13 ++--
 providers/fab/tests/unit/fab/utils.py              | 40 ++++------
 .../fab/www/views/test_views_custom_user_views.py  | 19 ++---
 8 files changed, 109 insertions(+), 98 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6947bb96dd7..35c062e6e25 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -534,6 +534,7 @@ repos:
         files: >
             (?x)
             ^airflow-ctl.*\.py$|
+            ^providers/fab.*\.py$|
             ^task_sdk.*\.py$
         pass_filenames: true
       - id: update-supported-versions
diff --git 
a/providers/fab/src/airflow/providers/fab/auth_manager/security_manager/override.py
 
b/providers/fab/src/airflow/providers/fab/auth_manager/security_manager/override.py
index d474335b833..2fa5c0c5b4b 100644
--- 
a/providers/fab/src/airflow/providers/fab/auth_manager/security_manager/override.py
+++ 
b/providers/fab/src/airflow/providers/fab/auth_manager/security_manager/override.py
@@ -63,7 +63,7 @@ from flask_jwt_extended import JWTManager
 from flask_login import LoginManager
 from itsdangerous import want_bytes
 from markupsafe import Markup, escape
-from sqlalchemy import func, inspect, or_, select
+from sqlalchemy import delete, func, inspect, or_, select
 from sqlalchemy.exc import MultipleResultsFound
 from sqlalchemy.orm import joinedload
 from werkzeug.security import check_password_hash, generate_password_hash
@@ -565,7 +565,7 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
             interface = self.appbuilder.get_app.session_interface
             session = interface.db.session
             user_session_model = interface.sql_session_model
-            num_sessions = session.query(user_session_model).count()
+            num_sessions = 
session.scalars(select(func.count()).select_from(user_session_model)).one()
             if num_sessions > MAX_NUM_DATABASE_USER_SESSIONS:
                 safe_username = escape(user.username)
                 self._cli_safe_flash(
@@ -580,7 +580,7 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
                     "warning",
                 )
             else:
-                for s in session.query(user_session_model):
+                for s in session.scalars(select(user_session_model)).all():
                     session_details = 
interface.serializer.loads(want_bytes(s.data))
                     if session_details.get("_user_id") == user.id:
                         session.delete(s)
@@ -1209,12 +1209,14 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
         """FAB leaves faulty permissions that need to be cleaned up."""
         self.log.debug("Cleaning faulty perms")
         sesh = self.appbuilder.get_session
-        perms = sesh.query(Permission).filter(
-            or_(
-                Permission.action == None,  # noqa: E711
-                Permission.resource == None,  # noqa: E711
+        perms = sesh.scalars(
+            select(Permission).where(
+                or_(
+                    Permission.action == None,  # noqa: E711
+                    Permission.resource == None,  # noqa: E711
+                )
             )
-        )
+        ).all()
         # Since FAB doesn't define ON DELETE CASCADE on these tables, we need
         # to delete the _object_ so that SQLA knows to delete the many-to-many
         # relationship object too. :(
@@ -1292,10 +1294,10 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
 
         :param name: the role name
         """
-        return 
self.get_session.query(self.role_model).filter_by(name=name).one_or_none()
+        return 
self.get_session.scalars(select(self.role_model).filter_by(name=name)).unique().one_or_none()
 
     def get_all_roles(self):
-        return self.get_session.query(self.role_model).all()
+        return self.get_session.scalars(select(self.role_model)).unique().all()
 
     def delete_role(self, role_name: str) -> None:
         """
@@ -1304,10 +1306,10 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
         :param role_name: the name of a role in the ab_role table
         """
         session = self.get_session
-        role = session.query(Role).filter(Role.name == role_name).first()
+        role = session.scalars(select(Role).where(Role.name == 
role_name)).first()
         if role:
             log.info("Deleting role '%s'", role_name)
-            session.delete(role)
+            session.execute(delete(Role).where(Role.name == role_name))
             session.commit()
         else:
             raise AirflowException(f"Role named '{role_name}' does not exist")
@@ -1338,7 +1340,11 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
         return _roles
 
     def get_public_role(self):
-        return 
self.get_session.query(self.role_model).filter_by(name=self.auth_role_public).one_or_none()
+        return (
+            
self.get_session.scalars(select(self.role_model).filter_by(name=self.auth_role_public))
+            .unique()
+            .one_or_none()
+        )
 
     """
     -----------
@@ -1395,7 +1401,7 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
 
     def count_users(self):
         """Return the number of users in the database."""
-        return self.get_session.query(func.count(self.user_model.id)).scalar()
+        return self.get_session.scalar(select(func.count(self.user_model.id)))
 
     def add_register_user(self, username, first_name, last_name, email, 
password="", hashed_password=""):
         """
@@ -1427,22 +1433,22 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
         if username:
             try:
                 if self.auth_username_ci:
-                    return (
-                        self.get_session.query(self.user_model)
-                        .filter(func.lower(self.user_model.username) == 
func.lower(username))
-                        .one_or_none()
+                    return self.get_session.scalars(
+                        select(self.user_model).where(
+                            func.lower(self.user_model.username) == 
func.lower(username)
+                        )
+                    ).one_or_none()
+                return self.get_session.scalars(
+                    select(self.user_model).where(
+                        func.lower(self.user_model.username) == 
func.lower(username)
                     )
-                return (
-                    self.get_session.query(self.user_model)
-                    .filter(func.lower(self.user_model.username) == 
func.lower(username))
-                    .one_or_none()
-                )
+                ).one_or_none()
             except MultipleResultsFound:
                 log.error("Multiple results found for user %s", username)
                 return None
         elif email:
             try:
-                return 
self.get_session.query(self.user_model).filter_by(email=email).one_or_none()
+                return 
self.get_session.scalars(select(self.user_model).filter_by(email=email)).one_or_none()
             except MultipleResultsFound:
                 log.error("Multiple results found for user with email %s", 
email)
                 return None
@@ -1474,7 +1480,7 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
             return False
 
     def get_all_users(self):
-        return self.get_session.query(self.user_model).all()
+        return self.get_session.scalars(select(self.user_model)).all()
 
     def update_user_auth_stat(self, user, success=True):
         """
@@ -1514,7 +1520,7 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
 
         :param name: name
         """
-        return 
self.get_session.query(self.action_model).filter_by(name=name).one_or_none()
+        return 
self.get_session.scalars(select(self.action_model).filter_by(name=name)).one_or_none()
 
     def create_action(self, name):
         """
@@ -1547,11 +1553,9 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
             log.warning(const.LOGMSG_WAR_SEC_DEL_PERMISSION, name)
             return False
         try:
-            perms = (
-                self.get_session.query(self.permission_model)
-                .filter(self.permission_model.action == action)
-                .all()
-            )
+            perms = self.get_session.scalars(
+                
select(self.permission_model).where(self.permission_model.action == action)
+            ).all()
             if perms:
                 log.warning(const.LOGMSG_WAR_SEC_DEL_PERM_PVM, action, perms)
                 return False
@@ -1575,7 +1579,7 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
 
         :param name: Name of resource
         """
-        return 
self.get_session.query(self.resource_model).filter_by(name=name).one_or_none()
+        return 
self.get_session.scalars(select(self.resource_model).filter_by(name=name)).one_or_none()
 
     def create_resource(self, name) -> Resource | None:
         """
@@ -1617,10 +1621,13 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
         resource = self.get_resource(resource_name)
         if action and resource:
             return (
-                self.get_session.query(self.permission_model)
-                .filter_by(action=action, resource=resource)
+                self.get_session.scalars(
+                    select(self.permission_model).filter_by(action=action, 
resource=resource)
+                )
+                .unique()
                 .one_or_none()
             )
+
         return None
 
     def get_resource_permissions(self, resource: Resource) -> Permission:
@@ -1629,7 +1636,9 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
 
         :param resource: Object representing a single resource.
         """
-        return 
self.get_session.query(self.permission_model).filter_by(resource_id=resource.id).all()
+        return self.get_session.scalars(
+            select(self.permission_model).filter_by(resource_id=resource.id)
+        ).all()
 
     def create_permission(self, action_name, resource_name) -> Permission | 
None:
         """
@@ -1676,9 +1685,9 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
         perm = self.get_permission(action_name, resource_name)
         if not perm:
             return
-        roles = (
-            
self.get_session.query(self.role_model).filter(self.role_model.permissions.contains(perm)).first()
-        )
+        roles = self.get_session.scalars(
+            
select(self.role_model).where(self.role_model.permissions.contains(perm))
+        ).first()
         if roles:
             log.warning(const.LOGMSG_WAR_SEC_DEL_PERMVIEW, resource_name, 
action_name, roles)
             return
@@ -1687,7 +1696,9 @@ class 
FabAirflowSecurityManagerOverride(AirflowSecurityManagerV2):
             self.get_session.delete(perm)
             self.get_session.commit()
             # if no more permission on permission view, delete permission
-            if not 
self.get_session.query(self.permission_model).filter_by(action=perm.action).all():
+            if not self.get_session.scalars(
+                select(self.permission_model).filter_by(action=perm.action)
+            ).all():
                 self.delete_action(perm.action.name)
             log.info(const.LOGMSG_INF_SEC_DEL_PERMVIEW, action_name, 
resource_name)
         except Exception as e:
diff --git 
a/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_role_and_permission_endpoint.py
 
b/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_role_and_permission_endpoint.py
index 8672456fb7a..76dd1923779 100644
--- 
a/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_role_and_permission_endpoint.py
+++ 
b/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_role_and_permission_endpoint.py
@@ -17,6 +17,7 @@
 from __future__ import annotations
 
 import pytest
+from sqlalchemy import select
 
 from airflow.providers.fab.www.api_connexion.exceptions import 
EXCEPTIONS_LINK_MAP
 from airflow.providers.fab.www.security import permissions
@@ -73,7 +74,7 @@ class TestRoleEndpoint:
         session = self.app.appbuilder.get_session
         existing_roles = set(EXISTING_ROLES)
         existing_roles.update(["Test", "TestNoPermissions"])
-        roles = 
session.query(Role).filter(~Role.name.in_(existing_roles)).all()
+        roles = 
session.scalars(select(Role).where(~Role.name.in_(existing_roles))).unique().all()
         for role in roles:
             delete_role(self.app, role.name)
 
@@ -353,7 +354,7 @@ class TestDeleteRole(TestRoleEndpoint):
         role = create_role(self.app, "mytestrole")
         response = self.client.delete(f"/fab/v1/roles/{role.name}", 
environ_overrides={"REMOTE_USER": "test"})
         assert response.status_code == 204
-        role_obj = session.query(Role).filter(Role.name == role.name).all()
+        role_obj = session.scalars(select(Role).where(Role.name == 
role.name)).all()
         assert len(role_obj) == 0
 
     def test_delete_should_respond_404(self):
diff --git 
a/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_user_endpoint.py 
b/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_user_endpoint.py
index 8ac12eed715..0b8b6eb2913 100644
--- 
a/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_user_endpoint.py
+++ 
b/providers/fab/tests/unit/fab/auth_manager/api_endpoints/test_user_endpoint.py
@@ -19,11 +19,10 @@ from __future__ import annotations
 import unittest.mock
 
 import pytest
-from sqlalchemy.sql.functions import count
+from sqlalchemy import delete, func, select
 
 from airflow.providers.fab.www.api_connexion.exceptions import 
EXCEPTIONS_LINK_MAP
 from airflow.providers.fab.www.security import permissions
-from airflow.utils import timezone
 from airflow.utils.session import create_session
 
 from tests_common.test_utils.compat import ignore_provider_compatibility_error
@@ -35,6 +34,12 @@ from unit.fab.auth_manager.api_endpoints.api_connexion_utils 
import (
     delete_user,
 )
 
+try:
+    from airflow.utils import timezone  # type: ignore[attr-defined]
+except AttributeError:
+    from airflow.sdk import timezone
+
+
 with ignore_provider_compatibility_error("2.9.0+", __file__):
     from airflow.providers.fab.auth_manager.models import User
 
@@ -85,8 +90,7 @@ class TestUserEndpoint:
 
     def teardown_method(self) -> None:
         # Delete users that have our custom default time
-        users = self.session.query(User).filter(User.changed_on == 
timezone.parse(DEFAULT_TIME))
-        users.delete(synchronize_session=False)
+        self.session.execute(delete(User).where(User.changed_on == 
timezone.parse(DEFAULT_TIME)))
         self.session.commit()
 
     def _create_users(self, count, roles=None):
@@ -354,11 +358,11 @@ EXAMPLE_USER_EMAIL = "[email protected]"
 
 def _delete_user(**filters):
     with create_session() as session:
-        user = session.query(User).filter_by(**filters).first()
+        user = session.scalars(select(User).filter_by(**filters)).first()
         if user is None:
             return
         user.roles = []
-        session.delete(user)
+        session.execute(delete(User).filter_by(**filters))
 
 
 @pytest.fixture
@@ -676,10 +680,7 @@ class TestPatchUser(TestUserEndpoint):
         assert "password" not in response.json
 
         mock_generate_password_hash.assert_called_once_with("new-pass")
-
-        password_in_db = (
-            self.session.query(User.password).filter(User.username == 
autoclean_username).scalar()
-        )
+        password_in_db = 
self.session.scalar(select(User.password).where(User.username == 
autoclean_username))
         assert password_in_db == "fake-hashed-pass"
 
     @pytest.mark.usefixtures("autoclean_admin_user")
@@ -788,7 +789,9 @@ class TestDeleteUser(TestUserEndpoint):
             environ_overrides={"REMOTE_USER": "test"},
         )
         assert response.status_code == 204, response.json  # NO CONTENT.
-        assert self.session.query(count(User.id)).filter(User.username == 
autoclean_username).scalar() == 0
+        assert (
+            
self.session.scalar(select(func.count(User.id)).where(User.username == 
autoclean_username)) == 0
+        )
 
     @pytest.mark.usefixtures("autoclean_admin_user")
     def test_unauthenticated(self, autoclean_username):
@@ -796,7 +799,9 @@ class TestDeleteUser(TestUserEndpoint):
             f"/fab/v1/users/{autoclean_username}",
         )
         assert response.status_code == 401, response.json
-        assert self.session.query(count(User.id)).filter(User.username == 
autoclean_username).scalar() == 1
+        assert (
+            
self.session.scalar(select(func.count(User.id)).where(User.username == 
autoclean_username)) == 1
+        )
 
     @pytest.mark.usefixtures("autoclean_admin_user")
     def test_forbidden(self, autoclean_username):
@@ -805,7 +810,9 @@ class TestDeleteUser(TestUserEndpoint):
             environ_overrides={"REMOTE_USER": "test_no_permissions"},
         )
         assert response.status_code == 403, response.json
-        assert self.session.query(count(User.id)).filter(User.username == 
autoclean_username).scalar() == 1
+        assert (
+            
self.session.scalar(select(func.count(User.id)).where(User.username == 
autoclean_username)) == 1
+        )
 
     def test_not_found(self, autoclean_username):
         # This test does not populate autoclean_admin_user into the database.
diff --git 
a/providers/fab/tests/unit/fab/auth_manager/schemas/test_user_schema.py 
b/providers/fab/tests/unit/fab/auth_manager/schemas/test_user_schema.py
index 7b1c06e7017..91853b16eb3 100644
--- a/providers/fab/tests/unit/fab/auth_manager/schemas/test_user_schema.py
+++ b/providers/fab/tests/unit/fab/auth_manager/schemas/test_user_schema.py
@@ -17,6 +17,7 @@
 from __future__ import annotations
 
 import pytest
+from sqlalchemy import select
 
 from airflow.utils import timezone
 
@@ -60,7 +61,7 @@ class TestUserBase:
         self.session = self.app.appbuilder.get_session
 
     def teardown_method(self):
-        user = self.session.query(User).filter(User.email == 
TEST_EMAIL).first()
+        user = self.session.scalars(select(User).where(User.email == 
TEST_EMAIL)).first()
         if user:
             self.session.delete(user)
             self.session.commit()
@@ -80,7 +81,7 @@ class TestUserCollectionItemSchema(TestUserBase):
         self.session.add(user_model)
         user_model.roles = [self.role]
         self.session.commit()
-        user = self.session.query(User).filter(User.email == 
TEST_EMAIL).first()
+        user = self.session.scalars(select(User).where(User.email == 
TEST_EMAIL)).first()
         deserialized_user = user_collection_item_schema.dump(user)
         # No user_id and password in dump
         assert deserialized_user == {
@@ -111,7 +112,7 @@ class TestUserSchema(TestUserBase):
         )
         self.session.add(user_model)
         self.session.commit()
-        user = self.session.query(User).filter(User.email == 
TEST_EMAIL).first()
+        user = self.session.scalars(select(User).where(User.email == 
TEST_EMAIL)).first()
         deserialized_user = user_schema.dump(user)
         # No user_id and password in dump
         assert deserialized_user == {
diff --git a/providers/fab/tests/unit/fab/auth_manager/test_security.py 
b/providers/fab/tests/unit/fab/auth_manager/test_security.py
index 3c1c797123f..8448239a4ce 100644
--- a/providers/fab/tests/unit/fab/auth_manager/test_security.py
+++ b/providers/fab/tests/unit/fab/auth_manager/test_security.py
@@ -28,7 +28,7 @@ import pytest
 import time_machine
 from flask_appbuilder import SQLA, Model, expose, has_access
 from flask_appbuilder.views import BaseView, ModelView
-from sqlalchemy import Column, Date, Float, Integer, String
+from sqlalchemy import Column, Date, Float, Integer, String, delete, func, 
select
 
 from airflow.exceptions import AirflowException
 from airflow.models import DagModel
@@ -138,7 +138,7 @@ def _create_dag_bundle(bundle_name, session):
 
 
 def _delete_dag_bundle(bundle_name, session):
-    session.query(DagBundleModel).filter(DagBundleModel.name == 
bundle_name).delete()
+    session.execute(delete(DagBundleModel).where(DagBundleModel.name == 
bundle_name))
     session.commit()
 
 
@@ -941,9 +941,10 @@ def test_no_additional_dag_permission_views_created(db, 
security_manager):
     ab_perm_role = assoc_permission_role
 
     security_manager.sync_roles()
-    num_pv_before = db.session().query(ab_perm_role).count()
+    num_pv_before = 
db.session().scalars(select(func.count()).select_from(ab_perm_role)).one()
+
     security_manager.sync_roles()
-    num_pv_after = db.session().query(ab_perm_role).count()
+    num_pv_after = 
db.session().scalars(select(func.count()).select_from(ab_perm_role)).one()
     assert num_pv_before == num_pv_after
 
 
@@ -1119,8 +1120,8 @@ def test_permissions_work_for_dags_with_dot_in_dagname(
             assert_user_has_dag_perms(perms=["GET", "PUT"], dag_id=dag_id, 
user=user)
             assert_user_does_not_have_dag_perms(perms=["GET", "PUT"], 
dag_id=dag_id_2, user=user)
             # Clean up DAG models and bundle
-            session.query(DagModel).delete()
-            session.query(DagBundleModel).filter(DagBundleModel.name == 
bundle_name).delete()
+            session.execute(delete(DagModel))
+            session.execute(delete(DagBundleModel).where(DagBundleModel.name 
== bundle_name))
             session.commit()
 
 
diff --git a/providers/fab/tests/unit/fab/utils.py 
b/providers/fab/tests/unit/fab/utils.py
index 9d0afc60639..ad8f9791a6b 100644
--- a/providers/fab/tests/unit/fab/utils.py
+++ b/providers/fab/tests/unit/fab/utils.py
@@ -25,6 +25,7 @@ from unittest import mock
 
 import flask
 import pytest
+from sqlalchemy import delete, select
 
 from airflow.models import Log
 
@@ -102,8 +103,8 @@ def _masked_value_check(data, sensitive_fields):
 
 
 def _check_last_log(session, dag_id, event, logical_date, expected_extra=None, 
check_masked=False):
-    logs = (
-        session.query(
+    logs = session.execute(
+        select(
             Log.dag_id,
             Log.task_id,
             Log.event,
@@ -118,8 +119,7 @@ def _check_last_log(session, dag_id, event, logical_date, 
expected_extra=None, c
         )
         .order_by(Log.dttm.desc())
         .limit(5)
-        .all()
-    )
+    ).all()
     assert len(logs) >= 1
     assert logs[0].extra
     if expected_extra:
@@ -128,28 +128,17 @@ def _check_last_log(session, dag_id, event, logical_date, 
expected_extra=None, c
         extra_json = json.loads(logs[0].extra)
         _masked_value_check(extra_json, sensitive_fields)
 
-    session.query(Log).delete()
+    session.execute(delete(Log))
 
 
 def _check_last_log_masked_connection(session, dag_id, event, logical_date):
-    logs = (
-        session.query(
-            Log.dag_id,
-            Log.task_id,
-            Log.event,
-            Log.logical_date,
-            Log.owner,
-            Log.extra,
-        )
-        .filter(
-            Log.dag_id == dag_id,
-            Log.event == event,
-            Log.logical_date == logical_date,
-        )
+    logs = session.execute(
+        select(Log.dag_id, Log.task_id, Log.event, Log.logical_date, 
Log.owner, Log.extra)
+        .where(Log.dag_id == dag_id, Log.event == event, Log.logical_date == 
logical_date)
         .order_by(Log.dttm.desc())
         .limit(5)
-        .all()
-    )
+    ).all()
+
     assert len(logs) >= 1
     extra = ast.literal_eval(logs[0].extra)
     assert extra == {
@@ -170,8 +159,8 @@ def _check_last_log_masked_variable(
     event,
     logical_date,
 ):
-    logs = (
-        session.query(
+    logs = session.execute(
+        select(
             Log.dag_id,
             Log.task_id,
             Log.event,
@@ -179,15 +168,14 @@ def _check_last_log_masked_variable(
             Log.owner,
             Log.extra,
         )
-        .filter(
+        .where(
             Log.dag_id == dag_id,
             Log.event == event,
             Log.logical_date == logical_date,
         )
         .order_by(Log.dttm.desc())
         .limit(5)
-        .all()
-    )
+    ).all()
     assert len(logs) >= 1
     extra_dict = ast.literal_eval(logs[0].extra)
     assert extra_dict == {"key": "x_secret", "val": "***"}
diff --git 
a/providers/fab/tests/unit/fab/www/views/test_views_custom_user_views.py 
b/providers/fab/tests/unit/fab/www/views/test_views_custom_user_views.py
index cd018f2c109..e63ce584e3b 100644
--- a/providers/fab/tests/unit/fab/www/views/test_views_custom_user_views.py
+++ b/providers/fab/tests/unit/fab/www/views/test_views_custom_user_views.py
@@ -23,6 +23,7 @@ from unittest import mock
 import pytest
 from flask.sessions import SecureCookieSessionInterface
 from flask_appbuilder import SQLA
+from sqlalchemy import delete, func, select
 
 from airflow import settings
 from airflow.providers.fab.www import app as application
@@ -214,7 +215,7 @@ class TestResetUserSessions:
         self.model = self.interface.sql_session_model
         self.serializer = self.interface.serializer
         self.db = self.interface.db
-        self.db.session.query(self.model).delete()
+        self.db.session.execute(delete(self.model))
         self.db.session.commit()
         self.db.session.flush()
         self.user_1 = create_user(
@@ -256,7 +257,7 @@ class TestResetUserSessions:
         self.create_user_db_session("session_id_2", time_delta, self.user_2.id)
         self.db.session.commit()
         self.db.session.flush()
-        assert self.db.session.query(self.model).count() == 2
+        assert 
self.db.session.scalar(select(func.count()).select_from(self.model)) == 2
         assert self.get_session_by_id("session_id_1") is not None
         assert self.get_session_by_id("session_id_2") is not None
 
@@ -264,14 +265,14 @@ class TestResetUserSessions:
         self.db.session.commit()
         self.db.session.flush()
         if user_sessions_deleted:
-            assert self.db.session.query(self.model).count() == 1
+            assert 
self.db.session.scalar(select(func.count()).select_from(self.model)) == 1
             assert self.get_session_by_id("session_id_1") is None
         else:
-            assert self.db.session.query(self.model).count() == 2
+            assert 
self.db.session.scalar(select(func.count()).select_from(self.model)) == 2
             assert self.get_session_by_id("session_id_1") is not None
 
     def get_session_by_id(self, session_id: str):
-        return self.db.session.query(self.model).filter(self.model.session_id 
== session_id).scalar()
+        return 
self.db.session.scalar(select(self.model).where(self.model.session_id == 
session_id))
 
     
@mock.patch("airflow.providers.fab.auth_manager.security_manager.override.flash")
     @mock.patch(
@@ -285,7 +286,7 @@ class TestResetUserSessions:
         self.create_user_db_session("session_id_2", timedelta(days=1), 
self.user_2.id)
         self.db.session.commit()
         self.db.session.flush()
-        assert self.db.session.query(self.model).count() == 2
+        assert 
self.db.session.scalar(select(func.count()).select_from(self.model)) == 2
         assert self.get_session_by_id("session_id_1") is not None
         assert self.get_session_by_id("session_id_2") is not None
         self.security_manager.reset_password(self.user_1.id, "new_password")
@@ -294,7 +295,7 @@ class TestResetUserSessions:
             "The old sessions for user user_to_delete_1 have <b>NOT</b> been 
deleted!"
             in flash_mock.call_args[0][0]
         )
-        assert self.db.session.query(self.model).count() == 2
+        assert 
self.db.session.scalar(select(func.count()).select_from(self.model)) == 2
         assert self.get_session_by_id("session_id_1") is not None
         assert self.get_session_by_id("session_id_2") is not None
 
@@ -320,7 +321,7 @@ class TestResetUserSessions:
         self.create_user_db_session("session_id_2", timedelta(days=1), 
self.user_2.id)
         self.db.session.commit()
         self.db.session.flush()
-        assert self.db.session.query(self.model).count() == 2
+        assert 
self.db.session.scalar(select(func.count()).select_from(self.model)) == 2
         assert self.get_session_by_id("session_id_1") is not None
         assert self.get_session_by_id("session_id_2") is not None
         self.security_manager.reset_password(self.user_1.id, "new_password")
@@ -329,7 +330,7 @@ class TestResetUserSessions:
             "The old sessions for user user_to_delete_1 have *NOT* been 
deleted!\n"
             in log_mock.warning.call_args[0][0]
         )
-        assert self.db.session.query(self.model).count() == 2
+        assert 
self.db.session.scalar(select(func.count()).select_from(self.model)) == 2
         assert self.get_session_by_id("session_id_1") is not None
         assert self.get_session_by_id("session_id_2") is not None
 

Reply via email to