@@ -235,30 +235,30 @@ def _add_specification(item_dict: dict) -> dict:
235235 return item_dict
236236
237237
238- def _add_user_names (db : Session , item_dict : dict ) -> dict :
239- """Add user names to inventory response dict"""
240- # Get borrower name
241- if item_dict .get ("borrower_id" ):
242- borrower = db .get (User , item_dict ["borrower_id" ])
243- item_dict ["borrower_name" ] = borrower .full_name or borrower .username if borrower else None
244- else :
245- item_dict ["borrower_name" ] = None
238+ # def _add_user_names(db: Session, item_dict: dict) -> dict:
239+ # """Add user names to inventory response dict"""
240+ # # Get borrower name
241+ # if item_dict.get("borrower_id"):
242+ # borrower = db.get(User, item_dict["borrower_id"])
243+ # item_dict["borrower_name"] = borrower.full_name or borrower.username if borrower else None
244+ # else:
245+ # item_dict["borrower_name"] = None
246246
247- # Get last borrower name
248- if item_dict .get ("last_borrower_id" ):
249- last_borrower = db .get (User , item_dict ["last_borrower_id" ])
250- item_dict ["last_borrower_name" ] = last_borrower .full_name or last_borrower .username if last_borrower else None
251- else :
252- item_dict ["last_borrower_name" ] = None
247+ # # Get last borrower name
248+ # if item_dict.get("last_borrower_id"):
249+ # last_borrower = db.get(User, item_dict["last_borrower_id"])
250+ # item_dict["last_borrower_name"] = last_borrower.full_name or last_borrower.username if last_borrower else None
251+ # else:
252+ # item_dict["last_borrower_name"] = None
253253
254- # Get created by name
255- if item_dict .get ("created_by_id" ):
256- created_by = db .get (User , item_dict ["created_by_id" ])
257- item_dict ["created_by_name" ] = created_by .full_name or created_by .username if created_by else None
258- else :
259- item_dict ["created_by_name" ] = None
254+ # # Get created by name
255+ # if item_dict.get("created_by_id"):
256+ # created_by = db.get(User, item_dict["created_by_id"])
257+ # item_dict["created_by_name"] = created_by.full_name or created_by.username if created_by else None
258+ # else:
259+ # item_dict["created_by_name"] = None
260260
261- return item_dict
261+ # return item_dict
262262
263263
264264# ==================== Named Routes (BEFORE /{id}) ====================
@@ -757,11 +757,41 @@ def norm_field(field):
757757 else :
758758 items = db .exec (base .order_by (order_expr )).all ()
759759
760+ # ================= 性能优化核心:批量查询用户(消除 N+1) =================
761+ # 遍历当前页的数据,收集所有需要查询的用户 ID
762+ user_ids = set ()
763+ for item in items :
764+ if item .borrower_id :
765+ user_ids .add (item .borrower_id )
766+ if item .last_borrower_id :
767+ user_ids .add (item .last_borrower_id )
768+ if item .created_by_id :
769+ user_ids .add (item .created_by_id )
770+
771+ # 用一条 SQL IN 语句,一次性查出这 50 条数据对应的所有用户
772+ users_map = {}
773+ if user_ids :
774+ users = db .exec (select (User ).where (User .id .in_ (user_ids ))).all ()
775+ # 构建内存字典 { user_id: "姓名" },查找速度是 O(1)
776+ users_map = {u .id : (u .full_name or u .username ) for u in users }
777+
778+ # 在内存中完成数据组装,绝不再向数据库发请求
779+ result_data = []
780+ for item in items :
781+ # 序列化单条数据
782+ item_dict = InventoryResponse .model_validate (item ).model_dump ()
783+ item_dict = _add_specification (item_dict )
784+
785+ # 直接从内存字典中塞入用户名字
786+ item_dict ["borrower_name" ] = users_map .get (item .borrower_id )
787+ item_dict ["last_borrower_name" ] = users_map .get (item .last_borrower_id )
788+ item_dict ["created_by_name" ] = users_map .get (item .created_by_id )
789+
790+ result_data .append (item_dict )
791+ # =========================================================================
792+
760793 result = {
761- "data" : [
762- _add_user_names (db , _add_specification (InventoryResponse .model_validate (i ).model_dump ()))
763- for i in items
764- ],
794+ "data" : result_data ,
765795 "total" : total ,
766796 "skip" : skip ,
767797 "limit" : limit ,
0 commit comments