from __future__ import annotations from typing import Any class PopularityRepositoryMixin: def upsert_popularity_factors(self, rows: list[dict[str, Any]]) -> int: values = [ ( str(row.get("trade_date") or ""), str(row.get("ts_code") or ""), int(row["ths_rank"]) if row.get("ths_rank") not in (None, "") else None, int(row["dc_rank"]) if row.get("dc_rank") not in (None, "") else None, float(row.get("combined_score") or 0), int(row["rank_change"]) if row.get("rank_change") not in (None, "") else None, int(bool(row.get("dual_source"))), ) for row in rows if row.get("trade_date") and row.get("ts_code") ] with self.connect() as connection: connection.executemany( """ INSERT INTO popularity_factors (trade_date, ts_code, ths_rank, dc_rank, combined_score, rank_change, dual_source) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(trade_date, ts_code) DO UPDATE SET ths_rank=excluded.ths_rank, dc_rank=excluded.dc_rank, combined_score=excluded.combined_score, rank_change=excluded.rank_change, dual_source=excluded.dual_source """, values, ) return len(values)