From 87dc72c837d1256f2e7821f86c4d0fc95f28c870 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Sat, 1 Nov 2025 16:43:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DPersonInfo=E8=AE=BF?= =?UTF-8?q?=E9=97=AEdetached=E5=AF=B9=E8=B1=A1=E5=AD=97=E6=AE=B5=E5=92=8C?= =?UTF-8?q?=E9=9D=9E=E5=94=AF=E4=B8=80=E6=9F=A5=E8=AF=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在get_values中添加try-except保护访问字段 - 在get_specific_value_list中添加try-except保护 - 修复get_person_info_by_name使用非唯一字段person_name查询 * 改用get_multi(limit=1)替代get_by避免MultipleResultsFound错误 - 防止缓存的detached对象导致Session绑定错误 --- src/person_info/person_info.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/person_info/person_info.py b/src/person_info/person_info.py index f5b4818bf..0c656f56a 100644 --- a/src/person_info/person_info.py +++ b/src/person_info/person_info.py @@ -620,10 +620,14 @@ class PersonInfoManager: continue if record: - value = getattr(record, field_name) - if value is not None: - result[field_name] = value - else: + try: + value = getattr(record, field_name) + if value is not None: + result[field_name] = value + else: + result[field_name] = copy.deepcopy(person_info_default.get(field_name)) + except Exception as e: + logger.warning(f"访问字段 {field_name} 失败: {e}, 使用默认值") result[field_name] = copy.deepcopy(person_info_default.get(field_name)) else: result[field_name] = copy.deepcopy(person_info_default.get(field_name)) @@ -651,9 +655,15 @@ class PersonInfoManager: crud = CRUDBase(PersonInfo) all_records = await crud.get_multi(limit=100000) # 获取所有记录 for record in all_records: - value = getattr(record, f_name, None) - if value is not None and way(value): - found_results[record.person_id] = value + try: + value = getattr(record, f_name, None) + if value is not None and way(value): + person_id_value = getattr(record, 'person_id', None) + if person_id_value: + found_results[person_id_value] = value + except Exception as e: + logger.warning(f"访问记录字段失败: {e}") + continue except Exception as e_query: logger.error( f"数据库查询失败 (specific_value_list for {f_name}): {e_query!s}", exc_info=True @@ -750,10 +760,11 @@ class PersonInfoManager: if not found_person_id: - # 使用CRUD进行查询 + # 使用CRUD进行查询 (person_name不是唯一字段,可能返回多条) crud = CRUDBase(PersonInfo) - record = await crud.get_by(person_name=person_name) - if record: + records = await crud.get_multi(person_name=person_name, limit=1) + if records: + record = records[0] found_person_id = record.person_id if ( found_person_id not in self.person_name_list @@ -761,7 +772,7 @@ class PersonInfoManager: ): self.person_name_list[found_person_id] = person_name else: - logger.debug(f"数据库中也未找到名为 '{person_name}' 的用户 (Peewee)") + logger.debug(f"数据库中也未找到名为 '{person_name}' 的用户") return None if found_person_id: