repositories 层 是数据访问层(Repository Pattern),封装了数据库表的 CRUD 操作,为上层业务逻辑提供简洁的接口。
一、Repository 层架构
整体架构图
scss
┌─────────────────────────────────────────────────────────────────────┐
│ Repository 层 │
├─────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ StockRepository │ │AnalysisRepository│ │BacktestRepository│ │
│ │ - 股票日线数据 │ │ - 分析历史记录 │ │ - 回测结果管理 │ │
│ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │ │
│ │ │ │ │
│ └──────────────────────┼─────────────────────┘ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ DatabaseManager │ │
│ │ (SQLAlchemy ORM) │ │
│ └──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ SQLite │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
模块划分
Repository 对应表 职责 StockRepository stock_daily 股票日线数据的存取 AnalysisRepository analysis_history 分析历史记录的 CRUD BacktestRepository backtest_results 回测结果管理 PortfolioRepository portfolio_* 模拟组合账户管理
二、核心设计模式
1. 依赖注入
python
class StockRepository:
def __init__(self, db_manager: Optional[DatabaseManager] = None):
"""支持依赖注入,便于测试"""
self.db = db_manager or DatabaseManager.get_instance()
优势 :
- 生产环境使用单例模式
- 测试环境可注入 Mock 对象
2. 方法封装
每个 Repository 封装对应表的操作:
python
class StockRepository:
def get_latest(self, code: str, days: int = 2) -> List[StockDaily]:
"""获取最近 N 天数据"""
def get_range(self, code: str, start_date, end_date) -> List[StockDaily]:
"""获取日期范围数据"""
def save_dataframe(self, df, code, data_source) -> int:
"""保存 DataFrame"""
def has_today_data(self, code, target_date) -> bool:
"""检查是否有今日数据"""
3. 异常处理
python
def get_latest(self, code: str, days: int = 2) -> List[StockDaily]:
try:
return self.db.get_latest_data(code, days)
except Exception as e:
logger.error(f"获取最新数据失败: {e}")
return [] # 返回空列表而非抛出异常
策略 :捕获异常并返回安全默认值,避免上层业务崩溃
三、各 Repository 详解
1. StockRepository (stock_repo.py)
核心方法 :
方法 功能 get_latest() 获取最近 N 天日线数据 get_range() 获取指定日期范围数据 save_dataframe() 保存 DataFrame 到数据库 has_today_data() 检查是否有指定日期数据
2. AnalysisRepository (analysis_repo.py)
核心方法 :
方法 功能 get_by_query_id() 根据 query_id 获取分析记录 get_list() 获取分析记录列表(支持筛选) save() 保存分析结果 delete() 删除分析记录
3. BacktestRepository (backtest_repo.py)
核心方法 :
方法 功能 get_candidates() 获取符合条件的回测候选记录 save_result() 保存单条回测结果 save_results_batch() 批量保存回测结果 get_results_paginated() 分页查询回测结果
4. PortfolioRepository (portfolio_repo.py)
核心方法 :
方法 功能 create_account() 创建组合账户 list_accounts() 获取账户列表 save_trade() 保存交易记录 get_positions() 获取持仓信息 get_daily_snapshot() 获取每日快照
四、设计优势
1. 解耦业务与数据层
- 业务层无需关心 SQL 细节
- 只需调用 Repository 方法
2. 测试友好
- 支持依赖注入,便于 Mock 测试
- 隔离数据库依赖
3. 代码复用
- 相同的数据操作集中封装
- 避免重复 SQL 代码
4. 接口清晰
- 每个 Repository 职责明确
- 方法命名语义化
五、数据流向
scss
业务层 (Service/Core)
│
▼
┌─────────────────────────────┐
│ Repository 层 │
│ (StockRepository, │
│ AnalysisRepository, ...) │
└───────────┬─────────────────┘
│
▼
┌─────────────────────────────┐
│ DatabaseManager │
│ (SQLAlchemy ORM 封装) │
└───────────┬─────────────────┘
│
▼
SQLite 数据库
六、总结
Repository 层采用经典的 Repository Pattern ,具有以下特点:
- 职责单一 :每个 Repository 只负责一个/一组相关表
- 依赖注入 :支持测试和扩展
- 异常隔离 :捕获并处理异常,返回安全默认值
- 接口简洁 :提供业务友好的方法命名
- 解耦设计 :隔离业务层与底层数据库实现 这种设计使得代码结构清晰、易于维护和测试。