From a85790f24abcfa045f54ccc6bd1a6ef20fda1168 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 26 Jun 2026 18:36:45 +0800 Subject: [PATCH] =?UTF-8?q?P2-3:=20workspace=5Fmember=5Frepository.py=20fi?= =?UTF-8?q?nd=5Fby=5Fworkspace=20=E6=96=B9=E6=B3=95=E6=B7=BB=E5=8A=A0=20JO?= =?UTF-8?q?IN=20=E9=A2=84=E5=8A=A0=E8=BD=BD=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqlalchemy_impl/workspace_member_repository.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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() )