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

45 lines
1.4 KiB
Python

"""演化候选数据访问。"""
from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.evolution import EvolutionCandidate
async def add_candidates(session: AsyncSession, candidates: list[EvolutionCandidate]) -> None:
session.add_all(candidates)
await session.flush()
async def get_candidate(session: AsyncSession, candidate_id: str) -> EvolutionCandidate | None:
return await session.get(EvolutionCandidate, candidate_id)
async def list_candidates(
session: AsyncSession,
character_id: str,
*,
status: str | None = None,
candidate_type: str | None = None,
page: int = 1,
page_size: int = 20,
) -> tuple[list[EvolutionCandidate], int]:
conditions = [EvolutionCandidate.character_id == character_id]
if status is not None:
conditions.append(EvolutionCandidate.status == status)
if candidate_type is not None:
conditions.append(EvolutionCandidate.type == candidate_type)
total = (
await session.execute(
select(func.count()).select_from(EvolutionCandidate).where(*conditions)
)
).scalar_one()
items_result = await session.execute(
select(EvolutionCandidate)
.where(*conditions)
.order_by(EvolutionCandidate.created_at.desc())
.offset(max(page - 1, 0) * page_size)
.limit(page_size)
)
return list(items_result.scalars().all()), int(total or 0)