diff --git a/packages/adapters/sqlalchemy_impl/workspace_member_repository.py b/packages/adapters/sqlalchemy_impl/workspace_member_repository.py index dcaac543c..ef0f3551b 100644 --- a/packages/adapters/sqlalchemy_impl/workspace_member_repository.py +++ b/packages/adapters/sqlalchemy_impl/workspace_member_repository.py @@ -1,11 +1,16 @@ from __future__ import annotations -from sqlalchemy.orm import Session +from typing import List, Optional, TYPE_CHECKING + +from sqlalchemy.orm import Session, joinedload from packages.adapters.sqlalchemy_impl.models import WorkspaceMemberModel from packages.domain.entities import WorkspaceMember from packages.ports.workspace_member_repository import WorkspaceMemberRepository +if TYPE_CHECKING: + from packages.adapters.sqlalchemy_impl.models import UserModel + class SQLAlchemyWorkspaceMemberRepository(WorkspaceMemberRepository): def __init__(self, session: Session): @@ -56,9 +61,15 @@ class SQLAlchemyWorkspaceMemberRepository(WorkspaceMemberRepository): return [self._to_entity(model) for model in models if model is not None] def find_by_workspace(self, workspace_id: str) -> list[WorkspaceMember]: + """查找 workspace 的所有成员,使用 JOIN 预加载用户数据避免 N+1 查询问题。 + + P2-3 Fix: 使用 joinedload 预加载关联的用户数据, + 这样在访问 member.user 时不会触发额外的数据库查询。 + """ models = ( self.session.query(WorkspaceMemberModel) .filter(WorkspaceMemberModel.workspace_id == workspace_id) + .options(joinedload(WorkspaceMemberModel.user)) # P2-3: JOIN 预加载用户数据 .order_by(WorkspaceMemberModel.joined_at.asc()) .all() )