#!/usr/bin/env bash # 服务器端脚本:清理指定交易日旧数据,并用新选股逻辑重新采集入库。 # # 适用场景:核心股追踪选股逻辑更新后,服务器上当天数据仍是旧口径, # 需要删掉重采(采集器幂等,不删会被 _has_collected 跳过)。 # # 用法(在服务器上执行): # ./recollect-daily.sh [日期] # 日期默认取服务器当天,格式 YYYY-MM-DD # ./recollect-daily.sh 2026-08-10 # 显式指定交易日 # # 依赖:docker 容器名为 auv(docker-compose.yml 中 container_name) set -euo pipefail CONTAINER="${CONTAINER:-auv}" DATE="${1:-$(date +%F)}" # 校验日期格式,防止注入/拼错 if ! [[ "${DATE}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then echo "❌ 日期格式错误:${DATE}(应为 YYYY-MM-DD)" exit 1 fi echo "================================================" echo "🚀 容器: ${CONTAINER} 交易日: ${DATE}" echo "================================================" # 确认容器在运行 if ! docker ps --format '{{.Names}}' | grep -qx "${CONTAINER}"; then echo "❌ 容器 ${CONTAINER} 未在运行" exit 1 fi echo "" echo "① 删除 ${DATE} 旧数据" # 通过环境变量传日期,避免日期值混入 python -c 的字符串拼接 docker exec -e TARGET_DATE="${DATE}" "${CONTAINER}" python -c " import os from database import get_connection date = os.environ['TARGET_DATE'] conn = get_connection() try: for tbl in ('daily_core_stocks', 'daily_core_stock_themes', 'daily_top_themes'): cur = conn.execute('DELETE FROM ' + tbl + ' WHERE trade_date = ?', (date,)) print(f' {tbl}: 删除 {cur.rowcount} 行') conn.commit() finally: conn.close() " echo "" echo "② 用新选股逻辑重采 ${DATE}" docker exec -e TARGET_DATE="${DATE}" "${CONTAINER}" python -c " import asyncio import os from services.daily_collector import collect_daily result = asyncio.run(collect_daily(os.environ['TARGET_DATE'])) print(' 结果:', result) " echo "" echo "✅ 完成"