daily_stock_analysis:数据访问层

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 ,具有以下特点:

  1. 职责单一 :每个 Repository 只负责一个/一组相关表
  2. 依赖注入 :支持测试和扩展
  3. 异常隔离 :捕获并处理异常,返回安全默认值
  4. 接口简洁 :提供业务友好的方法命名
  5. 解耦设计 :隔离业务层与底层数据库实现 这种设计使得代码结构清晰、易于维护和测试。
相关推荐
测试开发技术1 小时前
AI 测试提效 | 告别手工写脚本,分享我的 Playwright + Skill 批量生成 UI 自动化脚本方案
自动化测试·人工智能·ui·自动化·agent·skill·ai测试
喜欢的名字被抢了1 小时前
langgraph教程系列-05-给 agent 装上手脚 - 工具调用
agent·教程·langgraph
leeyi2 小时前
Embedder 接口 + 缓存层源码:一个把 key 撑大 3 倍的实现(第71篇-E57)
aigc·agent·ai编程
JaydenAI2 小时前
[Agent的评估-07]整合MEAI针对自然语言处理相关的评估器
ai·nlp·agent·evaluation·maf
CZW2 小时前
RAG系统核心解析:文档向量化与检索的实践探索
agent
code_371492 小时前
Agent 设计及实现 demo
agent
极客密码3 小时前
DeepSeek V4-Flash 正式版发布:Agent 基准、价格与 Codex 接入保姆级教程
agent·ai编程·deepseek
jsl_jsl_jsl5 小时前
claudecode学习 第 3 章 · Agent 循环与工具协议
agent
TrisighT5 小时前
一张路由表少写一行,装好的 tri-loop 就成了死 skill:我把 tri-intent 的 27 个落点扒了一遍
aigc·agent·ai编程
5pat54OfCg6 小时前
OpenCode 源码拆解(一):Agent 怎么活下来?——进程生命周期的 3 个设计模式
agent