From fc9775e61fddc7a876378c751afc6373b2a381ec Mon Sep 17 00:00:00 2001 From: yuliang_guo Date: Sat, 31 Jan 2026 18:31:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1SQLAlchemy=E5=BC=82=E6=AD=A5=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - create_task 和 get_tasks 现在使用 selectinload 预加载关联关系 - 避免懒加载导致的 MissingGreenlet 错误 --- backend/app/services/task_service.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/app/services/task_service.py b/backend/app/services/task_service.py index 6e6aa61..450ac1f 100644 --- a/backend/app/services/task_service.py +++ b/backend/app/services/task_service.py @@ -5,7 +5,7 @@ from typing import List, Optional from datetime import datetime from sqlalchemy import select, func, and_, case from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.orm import joinedload +from sqlalchemy.orm import joinedload, selectinload from app.models.task import Task, TaskCourse, TaskAssignment, TaskStatus, AssignmentStatus from app.models.course import Course from app.schemas.task import TaskCreate, TaskUpdate, TaskStatsResponse @@ -44,7 +44,14 @@ class TaskService(BaseService[Task]): db.add(assignment) await db.commit() - await db.refresh(task) + + # 重新查询并加载关联关系(避免懒加载问题) + stmt = select(Task).where(Task.id == task.id).options( + selectinload(Task.course_links).selectinload(TaskCourse.course), + selectinload(Task.assignments) + ) + result = await db.execute(stmt) + task = result.scalar_one() return task async def get_tasks( @@ -61,6 +68,12 @@ class TaskService(BaseService[Task]): stmt = stmt.where(Task.status == status) stmt = stmt.order_by(Task.created_at.desc()) + + # 加载关联关系 + stmt = stmt.options( + selectinload(Task.course_links).selectinload(TaskCourse.course), + selectinload(Task.assignments) + ) # 获取总数 count_stmt = select(func.count()).select_from(Task).where(Task.is_deleted == False) @@ -71,7 +84,7 @@ class TaskService(BaseService[Task]): # 分页 stmt = stmt.offset((page - 1) * page_size).limit(page_size) result = await db.execute(stmt) - tasks = result.scalars().all() + tasks = result.unique().scalars().all() return tasks, total