[+] improve ticker orm logic
This commit is contained in:
parent
181a9a5ce9
commit
dda9c841fd
25
deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/logic.py
vendored
25
deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/logic.py
vendored
@ -2,6 +2,8 @@ import datetime
|
|||||||
|
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
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 .models import Ticker, Market
|
||||||
from .utils import get_or_create
|
from .utils import get_or_create
|
||||||
@ -38,7 +40,26 @@ async def tickers_get_by_period(
|
|||||||
session: 'async_sessionmaker[AsyncSession]',
|
session: 'async_sessionmaker[AsyncSession]',
|
||||||
market_id: int,
|
market_id: int,
|
||||||
period: datetime.timedelta,
|
period: datetime.timedelta,
|
||||||
) -> None:
|
) -> list[Ticker]:
|
||||||
async with session() as active_session:
|
async with session() as active_session:
|
||||||
async with active_session.begin() as transaction:
|
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
|
||||||
|
9
deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/models.py
vendored
9
deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/models.py
vendored
@ -5,6 +5,7 @@ from sqlalchemy.orm import (
|
|||||||
mapped_column,
|
mapped_column,
|
||||||
Mapped,
|
Mapped,
|
||||||
DeclarativeBase,
|
DeclarativeBase,
|
||||||
|
relationship,
|
||||||
)
|
)
|
||||||
from sqlalchemy import (
|
from sqlalchemy import (
|
||||||
String,
|
String,
|
||||||
@ -25,6 +26,10 @@ class Market(Base):
|
|||||||
id: Mapped[int] = mapped_column(primary_key=True)
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
name: Mapped[str] = mapped_column(String(32))
|
name: Mapped[str] = mapped_column(String(32))
|
||||||
|
|
||||||
|
tickers: Mapped[list['Ticker']] = relationship(
|
||||||
|
back_populates='market',
|
||||||
|
)
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"Market(id={self.id!r}, name={self.name!r})"
|
return f"Market(id={self.id!r}, name={self.name!r})"
|
||||||
|
|
||||||
@ -35,6 +40,10 @@ class Ticker(Base):
|
|||||||
'tickers_market.id',
|
'tickers_market.id',
|
||||||
ondelete='CASCADE',
|
ondelete='CASCADE',
|
||||||
))
|
))
|
||||||
|
market: Mapped['Market'] = relationship(
|
||||||
|
back_populates='tickers'
|
||||||
|
)
|
||||||
|
|
||||||
timestamp: Mapped[datetime.datetime] = mapped_column(
|
timestamp: Mapped[datetime.datetime] = mapped_column(
|
||||||
DateTime(timezone=True,)
|
DateTime(timezone=True,)
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user