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. 解耦设计 :隔离业务层与底层数据库实现 这种设计使得代码结构清晰、易于维护和测试。
相关推荐
LinDaiDai_霖呆呆2 小时前
做 Agent 开发入门必懂的 10 个 Agent 核心概念
前端·agent·ai编程
七夜zippoe2 小时前
基于 JiuwenClaw AgentTeam 集群模式的年会策划实战:从源码部署到多智能体协作落地
人工智能·agent·openjiuwen·jiuwenclaw·agentteam
维元码簿2 小时前
Claude Code 深度拆解:远程模式 4 — 无环境直连架构
ai·agent·claude code·ai coding
devpotato3 小时前
人工智能(十六)- SSE 流式:让 Agent 像 ChatGPT 一样"边想边说"
langchain·llm·agent
用户948866003433 小时前
把串行 Agent Pipeline 改成 Temporal 工作流之后,快了 3 倍
agent
DigitalOcean3 小时前
AI 推理引擎四大模式:无服务推理、专用推理、批量推理与智能路由,怎么选?
llm·aigc·agent
Sonhhxg_柒3 小时前
【LLM】LangChain 深入研究:从原理到实践的全景解析
langchain·llm·agent·langgrah
92year4 小时前
Coder Agents 上手:把AI编程Agent部署到自己的服务器上
agent·ai编程·企业开发·自托管·coder
维元码簿4 小时前
Claude Code 深度拆解:远程模式 3 — 消息路由与传输层
ai·agent·claude code·ai coding