Files
crypto_monitor/scripts/clear_hub_kline_db.py
T
dekun ca6ef59a14 Add clear-and-refetch for hub K-line cache.
Force refresh wipes the series in hub_kline.db before pulling from the exchange; add a Linux clear script and rename the UI button to 清库重拉.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 11:31:16 +08:00

94 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""清空中控 K 线 SQLite 缓存(hub_kline.db),便于清库后全量重拉。
用法(Linux 云服务器,在仓库根目录):
python3 scripts/clear_hub_kline_db.py --dry-run
python3 scripts/clear_hub_kline_db.py --apply
python3 scripts/clear_hub_kline_db.py --apply --exchange binance --symbol BTC/USDT --timeframe 15m
默认库路径:环境变量 HUB_KLINE_DB_PATH,或 manual_trading_hub/data/hub_kline.db
"""
from __future__ import annotations
import argparse
import os
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from hub_kline_store import ( # noqa: E402
clear_all_bars,
clear_series_bars,
default_db_path,
init_db,
)
def main() -> int:
parser = argparse.ArgumentParser(description="Clear manual-trading-hub K-line SQLite cache.")
parser.add_argument(
"--db",
default=os.getenv("HUB_KLINE_DB_PATH", "").strip() or str(default_db_path()),
help="hub_kline.db path",
)
parser.add_argument("--exchange", default="", help="exchange_key, e.g. binance")
parser.add_argument("--symbol", default="", help="symbol, e.g. BTC/USDT")
parser.add_argument("--timeframe", default="", help="optional timeframe, e.g. 15m")
parser.add_argument("--dry-run", action="store_true", help="count only")
parser.add_argument("--apply", action="store_true", help="execute delete")
args = parser.parse_args()
db_path = Path(args.db)
if not db_path.is_file():
print(f"DB not found: {db_path}", file=sys.stderr)
return 1
init_db(db_path)
ex = (args.exchange or "").strip().lower()
sym = (args.symbol or "").strip().upper()
tf = (args.timeframe or "").strip().lower() or None
if args.dry_run and not args.apply:
import sqlite3
conn = sqlite3.connect(str(db_path))
try:
if ex and sym:
if tf:
n = conn.execute(
"SELECT COUNT(*) FROM ohlcv_bars WHERE exchange_key=? AND symbol=? AND timeframe=?",
(ex, sym, tf),
).fetchone()[0]
print(f"would delete series rows: {n} ({ex} {sym} {tf})")
else:
n = conn.execute(
"SELECT COUNT(*) FROM ohlcv_bars WHERE exchange_key=? AND symbol=?",
(ex, sym),
).fetchone()[0]
print(f"would delete symbol rows: {n} ({ex} {sym} all tf)")
else:
n = conn.execute("SELECT COUNT(*) FROM ohlcv_bars").fetchone()[0]
print(f"would delete all ohlcv_bars rows: {n}")
finally:
conn.close()
return 0
if not args.apply:
print("Specify --apply to delete (or --dry-run to preview).", file=sys.stderr)
return 1
if ex and sym:
removed = clear_series_bars(ex, sym, tf, db_path)
scope = f"{ex} {sym}" + (f" {tf}" if tf else " (all timeframes)")
print(f"cleared {removed} rows for {scope}")
else:
removed = clear_all_bars(db_path)
print(f"cleared all {removed} ohlcv_bars rows from {db_path}")
return 0
if __name__ == "__main__":
raise SystemExit(main())