Files
hunjing/backend/app/repositories/memory.py
T
2026-08-21 16:00:13 +08:00

74 lines
2.2 KiB
Python

"""记忆数据访问。"""
from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.memory import Memory
async def get_memory(session: AsyncSession, memory_id: str) -> Memory | None:
return await session.get(Memory, memory_id)
async def list_memories(
session: AsyncSession,
character_id: str,
*,
memory_type: str | None = None,
source: str | None = None,
page: int,
page_size: int,
active_only: bool = True,
) -> tuple[list[Memory], int]:
conditions = [Memory.character_id == character_id]
if active_only:
conditions.append(Memory.status == "active")
conditions.append(Memory.deleted_at.is_(None))
if memory_type is not None:
conditions.append(Memory.type == memory_type)
if source is not None:
conditions.append(Memory.source == source)
total_result = await session.execute(
select(func.count()).select_from(Memory).where(*conditions)
)
total = int(total_result.scalar_one())
result = await session.execute(
select(Memory)
.where(*conditions)
.order_by(Memory.importance.desc(), Memory.updated_at.desc())
.offset((page - 1) * page_size)
.limit(page_size)
)
return list(result.scalars().all()), total
async def list_injectable_memories(
session: AsyncSession, character_id: str, *, limit: int
) -> list[Memory]:
result = await session.execute(
select(Memory)
.where(
Memory.character_id == character_id,
Memory.status == "active",
Memory.deleted_at.is_(None),
)
.order_by(Memory.importance.desc(), Memory.updated_at.desc())
.limit(limit)
)
return list(result.scalars().all())
async def get_memories_by_ids(
session: AsyncSession, memory_ids: list[str]
) -> list[Memory]:
"""按 ID 列表批量获取记忆(按重要性降序排序,而非 ID 传入顺序)。"""
result = await session.execute(
select(Memory).where(
Memory.id.in_(memory_ids),
Memory.status == "active",
Memory.deleted_at.is_(None),
)
.order_by(Memory.importance.desc(), Memory.updated_at.desc())
)
return list(result.scalars().all())