From 34724e478cc60a444af439653de98e8e5d21b101 Mon Sep 17 00:00:00 2001 From: duxingchen Date: Mon, 10 Aug 2026 11:41:10 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20SQL=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E2=80=94func.and=5F()/or=5F()=E6=94=B9=E4=B8=BAsqlalchemy.and?= =?UTF-8?q?=5F()/or=5F()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/services/product_service.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/app/services/product_service.py b/backend/app/services/product_service.py index 92d8436..59da0df 100644 --- a/backend/app/services/product_service.py +++ b/backend/app/services/product_service.py @@ -420,15 +420,15 @@ async def get_all_products( overall_names: dict[uuid.UUID, str] = {} main_assignees: dict[uuid.UUID, str] = {} if product_ids: - from sqlalchemy import func as sa_func2, case as sa_case2 - main_where = sa_func2.and_( + from sqlalchemy import and_, or_, func as sa_func, case as sa_case + main_where = and_( Task.product_id.in_(product_ids), - sa_func2.or_( + or_( Task.parent_task_id.is_(None), Task.task_type.in_(["TRANSFER", "RECOVERY"]), ), ) - prio_expr = sa_case2( + prio_expr = sa_case( (Task.status == "WIP", 3), (Task.status == "PENDING", 2), (Task.status == "COMPLETED", 1), @@ -436,20 +436,20 @@ async def get_all_products( ) # 子查询:每个产品最高优先级主干任务 max_prio = ( - select(Task.product_id, sa_func2.max(prio_expr).label("prio")) + select(Task.product_id, sa_func.max(prio_expr).label("prio")) .where(main_where) .group_by(Task.product_id) ).subquery("mp") # JOIN 回 tasks 拿 task_name + assignee_id(同优先级取最新创建的) main_stmt = ( select(Task.product_id, Task.task_name, Task.assignee_id) - .join(max_prio, sa_func2.and_( + .join(max_prio, and_( Task.product_id == max_prio.c.product_id, prio_expr == max_prio.c.prio, )) .where(main_where) .order_by(Task.product_id, Task.created_at.desc()) - .distinct(Task.product_id) # PostgreSQL DISTINCT ON + .distinct(Task.product_id) ) main_result = await db.execute(main_stmt) for row in main_result: