选股逻辑变更后,服务器上当天旧数据需删除重采(幂等会跳过)。 脚本默认容器 auv、日期取服务器当天,支持显式传参;含日期格式与容器存在性校验。 Co-Authored-By: Claude <noreply@anthropic.com>
63 lines
2.0 KiB
Bash
Executable File
63 lines
2.0 KiB
Bash
Executable File
#!/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 "✅ 完成"
|