gao d217553d79 feat(sync): sync_history 表 + base.py 自动记录每次同步
新增 23 张表 sync_history:append-only,每次 task.run() 完成追加一行。

字段:
  dataset_id / run_date / status / trigger_source / started_at / finished_at /
  elapsed_sec / rows_written / message / error / stats (JSONB) / triggered_by
索引:
  (dataset_id, started_at) / (started_at) / (status)

vs dataset_registry 的区别:
  - dataset_registry 只保留「最后一次状态」便于快查
  - sync_history 保留完整历史,支持看板按天/按 task 维度聚合 + 失败回溯

自动落库:
  - SyncTask.run() 成功后调 _record_history()
  - 异常路径也写(避免排查时漏掉崩溃的 run)
  - 落库失败仅 warning 不阻塞主流程

新增 db_ops helpers:
  - insert_sync_history()
  - list_sync_history(dataset_id?, days, limit) 看板/API 用
  - daily_sync_summary(days) 按日期聚合 ok/warning/error/blocked

_ensure_schema 改造:
  从 no-op 改为用 superuser 连接跑 create_all(),SA 2.x IF NOT EXISTS 幂等。
  这样新增 model 不用手动跑 pg_bootstrap。生产首次部署仍建议跑 pg_bootstrap
  (它还要建 role / schema)。

测试: tests/test_schema_models.py 22 → 23 张表
2026-07-07 16:55:51 +08:00

market_data_sync

A 股市场数据定时同步与管理框架。

akshare / baostock / 新浪 / 雪球 / 麦蕊智数 等多个数据源接入到 MySQL 库,提供:

  • 后台线程调度器(time-based + interval-based,交易日感知)
  • 多数据源 + 自动降级 + 健康度监控
  • dataset_registry 同步状态机(运行中 / 成功 / 失败 / 中断恢复)
  • FastAPI 管理接口(手动触发、状态查询、失败重试)
  • CLI 入口(手动跑任务、查看状态)

📖 详细架构说明见 docs/ARCHITECTURE.md

快速开始

# 1. 准备环境(首次)
cp .env.example .env                 # 编辑 .env 填写真实 MySQL 凭据 + XUEQIU_TOKEN
chmod +x start.sh
./start.sh                           # 自动创建 .venv + 装依赖 + 启动 APIhttp://localhost:8100

# 2. 常用命令
./start.sh worker                    # 仅启动调度器(无 web
./start.sh list                      # 列出所有同步任务
./start.sh sync kline_daily          # 手动触发一次(dataset_id 即可)
./start.sh status                    # 查看调度器/数据源/同步任务状态
./start.sh datasources               # 查看数据源健康度
./start.sh reseed                    # 重新 seed 默认配置到 config 表

# 3. 一键全量同步(首次接入)
python bin/runall_once.py

# 4. 跑测试
.venv/bin/pytest tests/ -v

项目结构

app/
├── core/        # 核心抽象(config / db / sync / scheduler / datasource base
├── sources/     # 数据源实现(5 个)
├── tasks/       # 同步任务实现(8 个)
├── api/         # FastAPI 管理接口
└── entrypoints/ # 进程入口(cli + worker
bin/             # 一次性脚本
docs/            # 架构文档
tests/           # 单元测试

内置同步任务

dataset_id 触发时间 说明
stock_basic 交易日 09:00 全市场股票基础信息 + 股本
kline_daily 交易日 15:40 增量日 K 线(OHLCV,多源交叉)
kline_index 交易日 15:50 六大指数日线
kline_5min 交易日 16:00 增量 5 分钟 K 线
moneyflow 交易日 16:30 资金流(主力/大/中/小单净额)
industry_sector 周一 09:30 股票-行业映射(Baostock
share_snapshot 交易日 09:30 股本快照(雪球)
market_regime 交易日 16:00 市场情绪(衍生源)

添加新数据源

  1. app/sources/ 新建 my_source.py,继承 DataSource
  2. app/core/datasource/registry.pybuild_default_registry() 注册

添加新同步任务

  1. app/tasks/ 新建 task_xxx.py,继承 SyncTask,设置 dataset_id
  2. app/tasks/__init__.pyTASKS 字典注册
  3. (可选)在 app/core/sync/registry.pySYNC_DEFINITIONS 加条目

License

私有

S
Description
No description provided
Readme 385 KiB
Languages
Python 94.6%
Shell 5.4%