feat: DB-first architecture with lock-safe writes
- price_monitor: writes live prices to both JSON and mofin.db (holdings + live_prices + portfolio_summary) - mofin_db: added execute_with_retry/commit_with_retry with exponential backoff on 'database is locked' - mofin_db: increased timeout 5s->15s, added PRAGMA busy_timeout=15000 - price_monitor retry loop: fixed break-before-if-ok bug (was not retrying on write failure) - DB connection: WAL mode + retry decorator for all write operations - cash sync: preserves DB authoritative cash (JSON cash not pushed to DB) This is the DB-first version. JSON writes remain for dashboard compatibility. Next step: remove JSON writes entirely for full DB-only architecture.
This commit is contained in:
@@ -698,9 +698,8 @@ def compute_sector_adjustment(code, market_ctx, stock_sector_map):
|
||||
def load_macro_context():
|
||||
"""读取宏观上下文,返回 (bias, desc),优先 DB,回退 JSON"""
|
||||
try:
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
conn = sqlite3.connect(str(Path(__file__).parent.parent / "data" / "mofin.db"))
|
||||
from mofin_db import get_conn
|
||||
conn = get_conn()
|
||||
row = conn.execute(
|
||||
"SELECT indices, structure FROM macro_context_log "
|
||||
"WHERE has_valid_data=1 ORDER BY created_at DESC LIMIT 1"
|
||||
@@ -740,9 +739,8 @@ def batch_fetch_prices(codes):
|
||||
|
||||
# 主通道:从 DB 读取(price_monitor 唯一价格入口)
|
||||
try:
|
||||
import sqlite3
|
||||
db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db')
|
||||
db.row_factory = sqlite3.Row
|
||||
from mofin_db import get_conn
|
||||
db = get_conn()
|
||||
for raw_code in codes:
|
||||
raw_code = str(raw_code).split('_')[0]
|
||||
if not raw_code: continue
|
||||
@@ -842,9 +840,8 @@ def get_price_tencent(code):
|
||||
|
||||
# 主通道: DB
|
||||
try:
|
||||
import sqlite3
|
||||
db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db')
|
||||
db.row_factory = sqlite3.Row
|
||||
from mofin_db import get_conn
|
||||
db = get_conn()
|
||||
row = db.execute("SELECT price FROM holdings WHERE code=? AND is_active=1", (raw_code,)).fetchone()
|
||||
if not row:
|
||||
row = db.execute("SELECT price FROM holding_strategies WHERE code=? AND status='active' ORDER BY updated_at DESC LIMIT 1", (raw_code,)).fetchone()
|
||||
|
||||
Reference in New Issue
Block a user