diff --git a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/logic.py b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/logic.py index 82e0180..21d4169 100644 --- a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/logic.py +++ b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/logic.py @@ -2,6 +2,8 @@ import datetime from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import async_sessionmaker +from sqlalchemy.orm import selectinload +from sqlalchemy.future import select, make_transient from .models import Ticker, Market from .utils import get_or_create @@ -38,7 +40,26 @@ async def tickers_get_by_period( session: 'async_sessionmaker[AsyncSession]', market_id: int, period: datetime.timedelta, -) -> None: +) -> list[Ticker]: async with session() as active_session: async with active_session.begin() as transaction: - raise NotImplementedError + q = select( + Ticket + ).join(Ticket.market).where( + Market.id == market_id, + Ticker.timestamp >= datetime.datetime.now( + tz=datetime.timezone.utc + ) - period + ).order_by(Ticker.timestamp.desc()).options( + selectinload(Ticker.market) + ) + + res = await active_session.execute(q) + + rows = list(res) + + for o in rows: + active_session.expunge(o) + make_transient(o.market) + + return rows diff --git a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/models.py b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/models.py index 6b93689..38abbbb 100644 --- a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/models.py +++ b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/models.py @@ -5,6 +5,7 @@ from sqlalchemy.orm import ( mapped_column, Mapped, DeclarativeBase, + relationship, ) from sqlalchemy import ( String, @@ -25,6 +26,10 @@ class Market(Base): id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(32)) + tickers: Mapped[list['Ticker']] = relationship( + back_populates='market', + ) + def __repr__(self) -> str: return f"Market(id={self.id!r}, name={self.name!r})" @@ -35,6 +40,10 @@ class Ticker(Base): 'tickers_market.id', ondelete='CASCADE', )) + market: Mapped['Market'] = relationship( + back_populates='tickers' + ) + timestamp: Mapped[datetime.datetime] = mapped_column( DateTime(timezone=True,) )