From 8307633732e4ab1c7820816bbe170d2ca191cda2 Mon Sep 17 00:00:00 2001 From: MrButtCode Date: Sat, 7 Mar 2026 15:47:15 +0500 Subject: [PATCH 1/2] chore(db): update SQLAlchemy subquery to scalar_subquery to fix deprecation warnings --- mod_ci/controllers.py | 6 +++--- mod_customized/controllers.py | 2 +- mod_sample/controllers.py | 4 ++-- mod_test/controllers.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mod_ci/controllers.py b/mod_ci/controllers.py index d625103a..e1807b10 100755 --- a/mod_ci/controllers.py +++ b/mod_ci/controllers.py @@ -2433,7 +2433,7 @@ def progress_type_request(log, test, test_id, request) -> bool: )).scalar() results_zero_rc = g.db.query(RegressionTest.id).filter( RegressionTest.expected_rc == 0 - ).subquery() + ).scalar_subquery() results = g.db.query(count(TestResultFile.got)).filter( and_( TestResultFile.test_id == test.id, @@ -2509,13 +2509,13 @@ def update_final_status(): total_time = 0 if current_average is None: - platform_tests = g.db.query(Test.id).filter(Test.platform == test.platform).subquery() + platform_tests = g.db.query(Test.id).filter(Test.platform == test.platform).scalar_subquery() finished_tests = g.db.query(TestProgress.test_id).filter( and_( TestProgress.status.in_([TestStatus.canceled, TestStatus.completed]), TestProgress.test_id.in_(platform_tests) ) - ).subquery() + ).scalar_subquery() in_progress_statuses = [TestStatus.preparation, TestStatus.completed, TestStatus.canceled] finished_tests_progress = g.db.query(TestProgress).filter( and_( diff --git a/mod_customized/controllers.py b/mod_customized/controllers.py index c90cbc91..188514b9 100755 --- a/mod_customized/controllers.py +++ b/mod_customized/controllers.py @@ -81,7 +81,7 @@ def index(): elif username is not None: g.log.error('GitHub token not configured, cannot fetch commits') - populated_categories = g.db.query(regressionTestLinkTable.c.category_id).subquery() + populated_categories = g.db.query(regressionTestLinkTable.c.category_id).scalar_subquery() categories = Category.query.filter(Category.id.in_(populated_categories)).order_by(Category.name.asc()).all() tests = Test.query.filter(and_(TestFork.user_id == g.user.id, TestFork.test_id == Test.id)).order_by( diff --git a/mod_sample/controllers.py b/mod_sample/controllers.py index 5d315f5c..b3c33750 100755 --- a/mod_sample/controllers.py +++ b/mod_sample/controllers.py @@ -66,7 +66,7 @@ def display_sample_info(sample) -> Dict[str, Any]: if len(regression_tests) > 0: if test_commit is not None: - sq = g.db.query(RegressionTest.id).filter(RegressionTest.sample_id == sample.id).subquery() + sq = g.db.query(RegressionTest.id).filter(RegressionTest.sample_id == sample.id).scalar_subquery() exit_code = g.db.query(TestResult.exit_code).filter(and_( TestResult.exit_code != TestResult.expected_rc, and_(TestResult.test_id == test_commit.id, TestResult.regression_test_id.in_(sq)) @@ -83,7 +83,7 @@ def display_sample_info(sample) -> Dict[str, Any]: if test_release is not None: sq = g.db.query(RegressionTest.id).filter( - RegressionTest.sample_id == sample.id).subquery() + RegressionTest.sample_id == sample.id).scalar_subquery() exit_code = g.db.query(TestResult.exit_code).filter( and_( TestResult.exit_code != TestResult.expected_rc, diff --git a/mod_test/controllers.py b/mod_test/controllers.py index d5e91c9e..1f968e77 100644 --- a/mod_test/controllers.py +++ b/mod_test/controllers.py @@ -60,7 +60,7 @@ def get_test_results(test) -> List[Dict[str, Any]]: :param test: The test to retrieve the data for. :type test: Test """ - populated_categories = g.db.query(regressionTestLinkTable.c.category_id).subquery() + populated_categories = g.db.query(regressionTestLinkTable.c.category_id).scalar_subquery() categories = Category.query.filter(Category.id.in_(populated_categories)).order_by(Category.name.asc()).all() results = [{ 'category': category, From 9c74f5221d6d5aabc98c67029d67bd0108b6619c Mon Sep 17 00:00:00 2001 From: MrButtCode Date: Sun, 8 Mar 2026 13:39:00 +0500 Subject: [PATCH 2/2] refactor(db): upgrade subqueries to modern SQLAlchemy select() constructs --- mod_ci/controllers.py | 12 ++++++------ mod_customized/controllers.py | 4 ++-- mod_sample/controllers.py | 7 ++++--- mod_test/controllers.py | 4 ++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/mod_ci/controllers.py b/mod_ci/controllers.py index e1807b10..ee4cfe00 100755 --- a/mod_ci/controllers.py +++ b/mod_ci/controllers.py @@ -26,7 +26,7 @@ from lxml import etree from markdown2 import markdown from pymysql.err import IntegrityError -from sqlalchemy import and_, func +from sqlalchemy import and_, func, select from sqlalchemy.sql import label from sqlalchemy.sql.functions import count from werkzeug.utils import secure_filename @@ -2431,9 +2431,9 @@ def progress_type_request(log, test, test_id, request) -> bool: TestResult.test_id == test.id, TestResult.exit_code != TestResult.expected_rc )).scalar() - results_zero_rc = g.db.query(RegressionTest.id).filter( + results_zero_rc = select(RegressionTest.id).filter( RegressionTest.expected_rc == 0 - ).scalar_subquery() + ) results = g.db.query(count(TestResultFile.got)).filter( and_( TestResultFile.test_id == test.id, @@ -2509,13 +2509,13 @@ def update_final_status(): total_time = 0 if current_average is None: - platform_tests = g.db.query(Test.id).filter(Test.platform == test.platform).scalar_subquery() - finished_tests = g.db.query(TestProgress.test_id).filter( + platform_tests = select(Test.id).filter(Test.platform == test.platform) + finished_tests = select(TestProgress.test_id).filter( and_( TestProgress.status.in_([TestStatus.canceled, TestStatus.completed]), TestProgress.test_id.in_(platform_tests) ) - ).scalar_subquery() + ) in_progress_statuses = [TestStatus.preparation, TestStatus.completed, TestStatus.canceled] finished_tests_progress = g.db.query(TestProgress).filter( and_( diff --git a/mod_customized/controllers.py b/mod_customized/controllers.py index 188514b9..fa239cc6 100755 --- a/mod_customized/controllers.py +++ b/mod_customized/controllers.py @@ -4,7 +4,7 @@ from flask import Blueprint, g, redirect, request, url_for from github import Auth, Github, GithubException -from sqlalchemy import and_ +from sqlalchemy import and_, select from decorators import template_renderer from mod_auth.controllers import (check_access_rights, @@ -81,7 +81,7 @@ def index(): elif username is not None: g.log.error('GitHub token not configured, cannot fetch commits') - populated_categories = g.db.query(regressionTestLinkTable.c.category_id).scalar_subquery() + populated_categories = select(regressionTestLinkTable.c.category_id) categories = Category.query.filter(Category.id.in_(populated_categories)).order_by(Category.name.asc()).all() tests = Test.query.filter(and_(TestFork.user_id == g.user.id, TestFork.test_id == Test.id)).order_by( diff --git a/mod_sample/controllers.py b/mod_sample/controllers.py index b3c33750..dc3ef161 100755 --- a/mod_sample/controllers.py +++ b/mod_sample/controllers.py @@ -5,6 +5,7 @@ from typing import Any, Dict from flask import Blueprint, g, redirect, request, url_for +from sqlalchemy import select from decorators import template_renderer from exceptions import SampleNotFoundException @@ -66,7 +67,7 @@ def display_sample_info(sample) -> Dict[str, Any]: if len(regression_tests) > 0: if test_commit is not None: - sq = g.db.query(RegressionTest.id).filter(RegressionTest.sample_id == sample.id).scalar_subquery() + sq = select(RegressionTest.id).filter(RegressionTest.sample_id == sample.id) exit_code = g.db.query(TestResult.exit_code).filter(and_( TestResult.exit_code != TestResult.expected_rc, and_(TestResult.test_id == test_commit.id, TestResult.regression_test_id.in_(sq)) @@ -82,8 +83,8 @@ def display_sample_info(sample) -> Dict[str, Any]: status = 'Fail' if test_release is not None: - sq = g.db.query(RegressionTest.id).filter( - RegressionTest.sample_id == sample.id).scalar_subquery() + sq = select(RegressionTest.id).filter( + RegressionTest.sample_id == sample.id) exit_code = g.db.query(TestResult.exit_code).filter( and_( TestResult.exit_code != TestResult.expected_rc, diff --git a/mod_test/controllers.py b/mod_test/controllers.py index 1f968e77..e80c0a47 100644 --- a/mod_test/controllers.py +++ b/mod_test/controllers.py @@ -5,7 +5,7 @@ from flask import (Blueprint, Response, abort, g, jsonify, redirect, request, url_for) -from sqlalchemy import and_ +from sqlalchemy import and_, select from decorators import template_renderer from exceptions import TestNotFoundException @@ -60,7 +60,7 @@ def get_test_results(test) -> List[Dict[str, Any]]: :param test: The test to retrieve the data for. :type test: Test """ - populated_categories = g.db.query(regressionTestLinkTable.c.category_id).scalar_subquery() + populated_categories = select(regressionTestLinkTable.c.category_id) categories = Category.query.filter(Category.id.in_(populated_categories)).order_by(Category.name.asc()).all() results = [{ 'category': category,