fix: SQL语法错误—func.and_()/or_()改为sqlalchemy.and_()/or_()

This commit is contained in:
2026-08-10 11:41:10 +08:00
parent e447de6cfa
commit 34724e478c

View File

@ -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: