|
|
|
|
|
---
|
|
|
|
|
|
change: analysis-storage-refactor
|
|
|
|
|
|
design-doc: docs/superpowers/specs/2026-07-04-analysis-storage-refactor-design.md
|
|
|
|
|
|
base-ref: 82de2f9
|
|
|
|
|
|
archived-with: 2026-07-04-analysis-storage-refactor
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# Analysis Storage Refactor - 实施计划
|
|
|
|
|
|
|
|
|
|
|
|
> 基于 [Design Doc](docs/superpowers/specs/2026-07-04-analysis-storage-refactor-design.md) 拆分的可执行任务。
|
|
|
|
|
|
> 目标:将 `futures_analysis.db`(14 张表)迁移到 MySQL,并引入 Redis 缓存层,与行情数据存储策略保持一致。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 任务总览
|
|
|
|
|
|
|
|
|
|
|
|
| # | 任务 | 依赖 |
|
|
|
|
|
|
|---|------|------|
|
|
|
|
|
|
| T1 | 扩展 StorageManager 通用缓存方法 | - |
|
|
|
|
|
|
| T2 | 创建 analysis_migration.py 迁移脚本 | T1 |
|
|
|
|
|
|
| T3 | 修改 analysis_db.py 支持 MySQL/SQLite 动态切换 | T1 |
|
|
|
|
|
|
| T4 | 在 main.py lifespan 中集成迁移和表初始化 | T2, T3 |
|
|
|
|
|
|
| T5 | 编写测试用例 | T1-T4 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## T1: 扩展 StorageManager 通用缓存方法
|
|
|
|
|
|
|
|
|
|
|
|
**文件**: `app/storage_manager.py`
|
|
|
|
|
|
|
|
|
|
|
|
**任务**:
|
|
|
|
|
|
1. 新增 `cache_get(key)` 方法
|
|
|
|
|
|
2. 新增 `cache_set(key, value, ttl)` 方法
|
|
|
|
|
|
3. 新增 `cache_delete(key)` 方法
|
|
|
|
|
|
|
|
|
|
|
|
**验收**:
|
|
|
|
|
|
- 方法支持 Redis 命中/未命中
|
|
|
|
|
|
- 缓存 TTL 可配置
|
|
|
|
|
|
- 通用方法不依赖具体业务
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## T2: 创建 analysis_migration.py 迁移脚本
|
|
|
|
|
|
|
|
|
|
|
|
**文件**: `app/analysis_migration.py`
|
|
|
|
|
|
|
|
|
|
|
|
**任务**:
|
|
|
|
|
|
1. 实现 `migrate_analysis_sqlite_to_mysql()` 函数
|
|
|
|
|
|
2. 检测 MySQL analysis 表是否已有数据
|
|
|
|
|
|
3. 从 SQLite 读取全部数据
|
|
|
|
|
|
4. 批量写入 MySQL
|
|
|
|
|
|
5. 记录迁移日志
|
|
|
|
|
|
|
|
|
|
|
|
**验收**:
|
|
|
|
|
|
- 幂等性:MySQL 有数据时跳过迁移
|
|
|
|
|
|
- 迁移失败不影响应用启动
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## T3: 修改 analysis_db.py 使用 StorageManager
|
|
|
|
|
|
|
|
|
|
|
|
**文件**: `app/analysis_db.py`
|
|
|
|
|
|
|
|
|
|
|
|
**任务**:
|
|
|
|
|
|
1. 修改 `get_analysis_db()` 使用 StorageManager
|
|
|
|
|
|
2. 实现 MySQL 不可用时降级到 SQLite
|
|
|
|
|
|
3. 保持 API 接口不变
|
|
|
|
|
|
|
|
|
|
|
|
**验收**:
|
|
|
|
|
|
- API 调用透明切换存储后端
|
|
|
|
|
|
- 降级时功能正常
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## T4: 在 main.py lifespan 中集成
|
|
|
|
|
|
|
|
|
|
|
|
**文件**: `app/main.py`
|
|
|
|
|
|
|
|
|
|
|
|
**任务**:
|
|
|
|
|
|
1. 在 lifespan 中创建 analysis 表(MySQL)
|
|
|
|
|
|
2. 调用迁移函数
|
|
|
|
|
|
3. 记录启动日志
|
|
|
|
|
|
|
|
|
|
|
|
**验收**:
|
|
|
|
|
|
- 启动时自动创建 14 张表
|
|
|
|
|
|
- 自动迁移 SQLite 数据
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## T5: 编写测试用例
|
|
|
|
|
|
|
|
|
|
|
|
**文件**: `tests/test_analysis_storage.py`
|
|
|
|
|
|
|
|
|
|
|
|
**任务**:
|
|
|
|
|
|
1. 测试 Redis 缓存命中场景
|
|
|
|
|
|
2. 测试 Redis 缓存未命中回源 MySQL
|
|
|
|
|
|
3. 测试 MySQL 不可用降级到 SQLite
|
|
|
|
|
|
4. 测试数据迁移完整性
|
|
|
|
|
|
|
|
|
|
|
|
**验收**:
|
|
|
|
|
|
- 所有测试通过
|
|
|
|
|
|
- 覆盖三级降级场景
|