[+] improve ticker orm logic

This commit is contained in:
Siarhei Siniak 2025-07-15 14:05:45 +03:00
parent 181a9a5ce9
commit dda9c841fd
2 changed files with 32 additions and 2 deletions

@ -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

@ -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,)
)