From 070a63222ca2c9766beae078cf54a3f2fd5265ce Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Thu, 10 Jul 2025 11:18:15 +0300 Subject: [PATCH] [+] improve tickers storage in DB --- .../test_task_2025_06_30_v1/async_api/app.py | 12 +++++++++-- .../test_task_2025_06_30_v1/tickers/logic.py | 21 ++++++++++++++++++- .../test_task_2025_06_30_v1/tickers/utils.py | 3 ++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/app.py b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/app.py index a0542a2..20de15f 100644 --- a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/app.py +++ b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/async_api/app.py @@ -5,7 +5,7 @@ import logging from ..tickers_retrieval.emcont import Emcont from ..tickers.models import Ticker 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 from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import async_sessionmaker @@ -27,11 +27,19 @@ async def run() -> None: timestamp: datetime.datetime, session: 'async_sessionmaker[AsyncSession]', ) -> None: + markets = await markets_get_by_symbol( + session, + set([ + rate.symbol + for rate in rates + ]), + ) + await ticker_store_multiple( session, [ Ticker( - id=-1, + id=markets[rate.symbol].id, timestamp=timestamp, value=rate.value, ) 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 e83d12b..7a9f268 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 @@ -1,7 +1,26 @@ from sqlalchemy.ext.asyncio import AsyncSession 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( session: 'async_sessionmaker[AsyncSession]', diff --git a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/utils.py b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/utils.py index 3e7d059..1be6785 100644 --- a/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/utils.py +++ b/deps/test-task-2025-06-30-v1/python/online/fxreader/pr34/test_task_2025_06_30_v1/tickers/utils.py @@ -23,7 +23,8 @@ async def get_or_create( ) ) - row = res.one() + row = res.one()[0] + assert isinstance(row, model) return row