SQLinserts class handles all database operations, routing data to appropriate storage backends based on type and configuration.
Overview
SQLinserts is the data persistence layer that:
- Routes API responses to correct database tables
- Manages both SQLite (operational data) and TimescaleDB (time-series data) connections
- Handles schema creation and migrations
- Parses Steam’s formatted strings (prices, volumes, dates)
- Ensures data integrity with ACID transactions
Class Definition
Constructor Parameters
Path to SQLite database file for operational data (price_overview, orders_histogram, orders_activity)
PostgreSQL connection string for TimescaleDB. If None, price_history will use SQLite instead.Format:
"postgresql://user:pass@localhost/dbname"Minimum connections in TimescaleDB pool
Maximum connections in TimescaleDB pool
Methods
initialize()
Initialize database connections and create schemas.- Creates SQLite connection with performance optimizations (WAL mode, memory-mapped I/O)
- Sets busy timeout to 30 seconds for concurrent access
- Creates all tables and indexes
- Establishes TimescaleDB connection pool if configured
- Creates hypertable with compression and retention policies
close()
Close all database connections.store_data()
Route data to appropriate database based on type.PriceOverviewData→ SQLiteprice_overviewtableOrdersHistogramData→ SQLiteorders_histogramtableOrdersActivityData→ SQLiteorders_activitytablePriceHistoryData→ TimescaleDB (or SQLite if not configured)
Database Configuration
SQLite Optimizations
The class applies these optimizations for concurrent access:TimescaleDB Hypertable
When TimescaleDB is configured, theprice_history table becomes a hypertable with:
- Compression policy: Compress data older than 7 days
- Retention policy: Delete data older than 90 days
- Segmentation: By
market_hash_namefor optimal compression
Usage Examples
Basic Usage (SQLite only)
With TimescaleDB
Manual Connection Management
Data Parsing Utilities
The class includes private utility methods for parsing Steam’s formatted data:_parse_steam_price()
Parses price strings with various currency symbols and formats:"0,03€"→0.03"$5.00"→5.0"1.234,56€"→1234.56
_parse_volume()
Parses volume strings to integers:"435"→435"1,234"→1234
_extract_currency()
Extracts ISO 4217 currency codes from price strings:"$5.00"→"USD""0,03€"→"EUR""£4.99"→"GBP"
_parse_steam_datetime()
Parses Steam’s datetime format:"Jul 02 2014 01: +0"→datetime(2014, 7, 2, 1, 0)
Storage Strategy
Operational Data (SQLite)
- price_overview: Current market snapshots, fast inserts
- orders_histogram: Order book depth, JSON storage for tables/graphs
- orders_activity: Trade feed with parsed activities
(market_hash_name, timestamp DESC) for fast queries.
Time-Series Data (TimescaleDB or SQLite)
- price_history: Hourly price points, optimized for time-series queries
- Automatic compression after 7 days
- Automatic retention (90 days)
- Hypertable chunking for query performance
- Batch inserts with conflict resolution (ON CONFLICT DO NOTHING)
- UNIQUE constraint on
(market_hash_name, time) - Same batch insert logic with conflict resolution
- Suitable for smaller datasets or development
Error Handling
The class handles:- Duplicate inserts: ON CONFLICT DO NOTHING for price_history
- Lock contention: 30-second busy timeout for SQLite
- Connection failures: Graceful cleanup via context manager
- Invalid data: Parsing utilities return None for unparseable values
Performance Characteristics
- Batch inserts: 100-record batches for TimescaleDB, 50 for SQLite
- Concurrent writes: WAL mode allows multiple readers + one writer
- Memory usage: 64MB SQLite cache, 256MB mmap
- Connection pooling: 10-100 connections for TimescaleDB
Related Topics
Data Models
Pydantic models for API responses
Database Schema
Complete table schemas and indexes
Steam API Client
Fetching data from Steam API
Installation
TimescaleDB setup instructions