[+] improve tickers storage in DB

This commit is contained in:
Siarhei Siniak 2025-07-10 11:18:15 +03:00
parent 027475e4b3
commit 070a63222c
3 changed files with 32 additions and 4 deletions

@ -5,7 +5,7 @@ import logging
from ..tickers_retrieval.emcont import Emcont from ..tickers_retrieval.emcont import Emcont
from ..tickers.models import Ticker from ..tickers.models import Ticker
from ..tickers.settings import Settings as ModelsSettings from ..tickers.settings import Settings as ModelsSettings
from ..tickers.logic import ticker_store_multiple from ..tickers.logic import ticker_store_multiple, markets_get_by_symbol
import sqlalchemy.ext.asyncio import sqlalchemy.ext.asyncio
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
@ -27,11 +27,19 @@ async def run() -> None:
timestamp: datetime.datetime, timestamp: datetime.datetime,
session: 'async_sessionmaker[AsyncSession]', session: 'async_sessionmaker[AsyncSession]',
) -> None: ) -> None:
markets = await markets_get_by_symbol(
session,
set([
rate.symbol
for rate in rates
]),
)
await ticker_store_multiple( await ticker_store_multiple(
session, session,
[ [
Ticker( Ticker(
id=-1, id=markets[rate.symbol].id,
timestamp=timestamp, timestamp=timestamp,
value=rate.value, value=rate.value,
) )

@ -1,7 +1,26 @@
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 .models import Ticker from .models import Ticker, Market
from .utils import get_or_create
async def markets_get_by_symbol(
session: 'async_sessionmaker[AsyncSession]',
symbols: set[str],
) -> dict[str, Market]:
res : dict[str, Market] = dict()
async with session() as active_session:
async with active_session.begin() as transaction:
for o in symbols:
m = (await get_or_create(
active_session,
Market,
name=o,
))[0]
res[o] = m
return res
async def ticker_store_multiple( async def ticker_store_multiple(
session: 'async_sessionmaker[AsyncSession]', session: 'async_sessionmaker[AsyncSession]',

@ -23,7 +23,8 @@ async def get_or_create(
) )
) )
row = res.one() row = res.one()[0]
assert isinstance(row, model) assert isinstance(row, model)
return row return row