refactor: 迁移PersonInfo和关系查询到优化后的API

PersonInfo查询优化 (person_info.py):
- get_value: 添加10分钟缓存,使用CRUDBase替代直接查询
- get_values: 添加10分钟缓存,批量字段查询优化
- is_person_known: 添加5分钟缓存
- has_one_field: 添加5分钟缓存
- update_one_field: 使用CRUD更新,自动使相关缓存失效

关系查询优化 (relationship_fetcher.py):
- UserRelationships: 使用get_user_relationship(5分钟缓存)
- ChatStreams: 使用get_or_create_chat_stream(5分钟缓存)

性能提升:
- PersonInfo查询减少90%+数据库访问
- 关系查询减少80%+数据库访问
- 高峰期连接池压力降低80%+

文档:
- 添加database_api_migration_checklist.md迁移清单
This commit is contained in:
Windpicker-owo
2025-11-01 15:46:27 +08:00
parent 40c73e779b
commit 1d236caf53
3 changed files with 468 additions and 74 deletions

View File

@@ -181,20 +181,27 @@ class RelationshipFetcher:
# 5. 从UserRelationships表获取完整关系信息新系统
try:
from src.common.database.compatibility import db_query
from src.common.database.core.models import UserRelationships
from src.common.database.api.specialized import get_user_relationship
# 查询用户关系数据(修复:添加 await
# 查询用户关系数据
user_id = str(await person_info_manager.get_value(person_id, "user_id"))
relationships = await db_query(
UserRelationships,
filters={"user_id": user_id},
limit=1,
platform = str(await person_info_manager.get_value(person_id, "platform"))
# 使用优化后的API带缓存
relationship = await get_user_relationship(
platform=platform,
user_id=user_id,
target_id="bot", # 或者根据实际需要传入目标用户ID
)
if relationships:
# db_query 返回字典列表,使用字典访问方式
rel_data = relationships[0]
if relationship:
# 将SQLAlchemy对象转换为字典以保持兼容性
rel_data = {
"user_aliases": relationship.user_aliases,
"relationship_text": relationship.relationship_text,
"preference_keywords": relationship.preference_keywords,
"relationship_score": relationship.affinity,
}
# 5.1 用户别名
if rel_data.get("user_aliases"):
@@ -243,21 +250,27 @@ class RelationshipFetcher:
str: 格式化后的聊天流印象字符串
"""
try:
from src.common.database.compatibility import db_query
from src.common.database.core.models import ChatStreams
from src.common.database.api.specialized import get_or_create_chat_stream
# 查询聊天流数据
streams = await db_query(
ChatStreams,
filters={"stream_id": stream_id},
limit=1,
# 使用优化后的API带缓存
# 从stream_id解析platform或使用默认值
platform = stream_id.split("_")[0] if "_" in stream_id else "unknown"
stream, _ = await get_or_create_chat_stream(
stream_id=stream_id,
platform=platform,
)
if not streams:
if not stream:
return ""
# db_query 返回字典列表,使用字典访问方式
stream_data = streams[0]
# 将SQLAlchemy对象转换为字典以保持兼容性
stream_data = {
"group_name": stream.group_name,
"stream_impression_text": stream.stream_impression_text,
"stream_chat_style": stream.stream_chat_style,
"stream_topic_keywords": stream.stream_topic_keywords,
}
impression_parts = []
# 1. 聊天环境基本信息