"""K 线数据访问(从库读)。 写入由 DataProvider 适配器负责(阶段1 接 Tushare/AKShare)。 MVP 的数据由 synthetic.seed_if_empty 灌入。 """ from __future__ import annotations from datetime import datetime from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from ..models import Candle async def get_candles( session: AsyncSession, symbol: str, timeframe: str = "1d", start: datetime | None = None, end: datetime | None = None, limit: int = 5000, ) -> list[Candle]: stmt = select(Candle).where( Candle.symbol == symbol, Candle.timeframe == timeframe, ) if start is not None: stmt = stmt.where(Candle.ts >= start) if end is not None: stmt = stmt.where(Candle.ts <= end) stmt = stmt.order_by(Candle.ts.asc()).limit(limit) result = await session.execute(stmt) return list(result.scalars().all())