- Introduced a modular repository structure by creating separate repository classes for `Bot`, `MarketData`, and `RawTrade`, improving code organization and maintainability. - Updated the `DatabaseOperations` class to utilize the new repository classes, enhancing the abstraction of database interactions. - Refactored the `.env` file to update database connection parameters and add new logging and health monitoring configurations. - Modified the `okx_config.json` to change default timeframes for trading pairs, aligning with updated requirements. - Added comprehensive unit tests for the new repository classes, ensuring robust functionality and reliability. These changes improve the overall architecture of the database layer, making it more scalable and easier to manage.
128 lines
5.0 KiB
Python
128 lines
5.0 KiB
Python
"""Repository for raw_trades table operations."""
|
|
|
|
import json
|
|
from datetime import datetime
|
|
from typing import Dict, Any, Optional, List
|
|
from sqlalchemy import text
|
|
|
|
from ..models import RawTrade
|
|
from data.base_collector import MarketDataPoint
|
|
from .base_repository import BaseRepository, DatabaseOperationError
|
|
|
|
|
|
class RawTradeRepository(BaseRepository):
|
|
"""Repository for raw_trades table operations."""
|
|
|
|
def insert_market_data_point(self, data_point: MarketDataPoint) -> bool:
|
|
"""
|
|
Insert a market data point into raw_trades table.
|
|
"""
|
|
try:
|
|
with self.get_session() as session:
|
|
query = text("""
|
|
INSERT INTO raw_trades (
|
|
exchange, symbol, timestamp, data_type, raw_data, created_at
|
|
) VALUES (
|
|
:exchange, :symbol, :timestamp, :data_type, :raw_data, NOW()
|
|
)
|
|
""")
|
|
|
|
session.execute(query, {
|
|
'exchange': data_point.exchange,
|
|
'symbol': data_point.symbol,
|
|
'timestamp': data_point.timestamp,
|
|
'data_type': data_point.data_type.value,
|
|
'raw_data': json.dumps(data_point.data)
|
|
})
|
|
|
|
session.commit()
|
|
|
|
self.log_debug(f"Stored raw {data_point.data_type.value} data for {data_point.symbol}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
self.log_error(f"Error storing raw data for {data_point.symbol}: {e}")
|
|
raise DatabaseOperationError(f"Failed to store raw data: {e}")
|
|
|
|
def insert_raw_websocket_data(self,
|
|
exchange: str,
|
|
symbol: str,
|
|
data_type: str,
|
|
raw_data: Dict[str, Any],
|
|
timestamp: Optional[datetime] = None) -> bool:
|
|
"""
|
|
Insert raw WebSocket data for debugging purposes.
|
|
"""
|
|
try:
|
|
if timestamp is None:
|
|
timestamp = datetime.now()
|
|
|
|
with self.get_session() as session:
|
|
query = text("""
|
|
INSERT INTO raw_trades (
|
|
exchange, symbol, timestamp, data_type, raw_data, created_at
|
|
) VALUES (
|
|
:exchange, :symbol, :timestamp, :data_type, :raw_data, NOW()
|
|
)
|
|
""")
|
|
|
|
session.execute(query, {
|
|
'exchange': exchange,
|
|
'symbol': symbol,
|
|
'timestamp': timestamp,
|
|
'data_type': data_type,
|
|
'raw_data': json.dumps(raw_data)
|
|
})
|
|
|
|
session.commit()
|
|
|
|
self.log_debug(f"Stored raw WebSocket data: {data_type} for {symbol}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
self.log_error(f"Error storing raw WebSocket data for {symbol}: {e}")
|
|
raise DatabaseOperationError(f"Failed to store raw WebSocket data: {e}")
|
|
|
|
def get_raw_trades(self,
|
|
symbol: str,
|
|
data_type: str,
|
|
start_time: datetime,
|
|
end_time: datetime,
|
|
exchange: str = "okx",
|
|
limit: Optional[int] = None) -> List[Dict[str, Any]]:
|
|
"""
|
|
Retrieve raw trades from the database.
|
|
"""
|
|
try:
|
|
with self.get_session() as session:
|
|
query = text("""
|
|
SELECT id, exchange, symbol, timestamp, data_type, raw_data, created_at
|
|
FROM raw_trades
|
|
WHERE exchange = :exchange
|
|
AND symbol = :symbol
|
|
AND data_type = :data_type
|
|
AND timestamp >= :start_time
|
|
AND timestamp <= :end_time
|
|
ORDER BY timestamp ASC
|
|
""")
|
|
|
|
if limit:
|
|
query_str = str(query.compile(compile_kwargs={"literal_binds": True})) + f" LIMIT {limit}"
|
|
query = text(query_str)
|
|
|
|
result = session.execute(query, {
|
|
'exchange': exchange,
|
|
'symbol': symbol,
|
|
'data_type': data_type,
|
|
'start_time': start_time,
|
|
'end_time': end_time
|
|
})
|
|
|
|
trades = [dict(row._mapping) for row in result]
|
|
|
|
self.log_info(f"Retrieved {len(trades)} raw trades for {symbol} {data_type}")
|
|
return trades
|
|
|
|
except Exception as e:
|
|
self.log_error(f"Error retrieving raw trades for {symbol}: {e}")
|
|
raise DatabaseOperationError(f"Failed to retrieve raw trades: {e}") |