数据层采用 SQLite + SQLAlchemy ORM 构建,实现了完整的数据持久化、事务管理和并发安全机制。
一、数据层架构
整体架构图
┌─────────────────────────────────────────────────────────────────────┐
│ 数据层架构 │
├─────────────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ DatabaseManager (单例模式) │ │
│ │ - 管理数据库连接 │ │
│ │ - 事务管理与重试机制 │ │
│ │ - 并发安全保障 (WAL模式 + 写锁) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ SQLAlchemy ORM 数据模型 │ │
│ │ - StockDaily: 日线行情数据 │ │
│ │ - AnalysisHistory: 分析历史记录 │ │
│ │ - NewsIntel: 新闻情报 │ │
│ │ - BacktestResult: 回测结果 │ │
│ │ - Portfolio*: 模拟组合数据 │ │
│ │ - LlmUsage: LLM调用记录 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ SQLite 数据库 │ │
│ │ - 单文件存储 (data/stocks.db) │ │
│ │ - WAL模式支持并发读写 │ │
│ │ - 自动建表与索引 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
二、核心数据模型
1. 股票日线数据 (StockDaily)
字段 类型 说明 code String(10) 股票代码 date Date 交易日期 open/high/low/close Float OHLC价格 volume Float 成交量(股) amount Float 成交额(元) pct_chg Float 涨跌幅(%) ma5/ma10/ma20 Float 移动平均线 volume_ratio Float 量比 data_source String(50) 数据来源
唯一约束 : (code, date) 确保同一股票同一日期只有一条记录
2. 分析历史记录 (AnalysisHistory)
字段 类型 说明 code String(10) 股票代码 report_type String(16) 报告类型 sentiment_score Integer 情绪评分 (0-100) operation_advice String(20) 操作建议(买入/观望/卖出) trend_prediction String(50) 趋势预测 ideal_buy/secondary_buy Float 狙击点位 stop_loss/take_profit Float 止损/止盈位 raw_result Text 原始分析结果(JSON)
3. 其他核心表
表名 用途 关键字段 news_intel 新闻情报 code , title , url , published_date backtest_results 回测结果 analysis_history_id , eval_status , total_return portfolio_accounts 组合账户 owner_id , name , market , base_currency portfolio_trades 交易记录 account_id , symbol , side , quantity , price llm_usage LLM调用记录 model , prompt_tokens , completion_tokens
三、数据库管理器设计
1. 单例模式
class DatabaseManager:
_instance: Optional['DatabaseManager'] = None
@classmethod
def get_instance(cls) -> 'DatabaseManager':
"""获取单例实例"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
2. SQLite 优化配置
配置项 值 作用 journal_mode WAL 写前日志模式,支持并发读写 busy_timeout 30000ms 等待锁释放超时时间 write_retry_max 3 写入失败重试次数 write_retry_base_delay 0.1s 重试基础延迟
3. 事务管理机制
def _run_write_transaction(self, operation_name, write_operation):
"""
执行写事务,支持SQLite锁冲突重试
流程:
1. 使用 BEGIN IMMEDIATE 获取写锁
2. 执行写操作
3. 提交事务
4. 如遇锁冲突,指数退避重试
"""
指数退避策略 : delay = base_delay * (2 ^ attempt)
4. 批量 UPSERT 策略
def save_daily_data(self, df, code, data_source):
"""
批量保存日线数据
策略:
- 按 (code, date) 做 UPSERT
- SQLite 按 50 条/批写入(避免绑定参数上限)
- 返回实际新增记录数(不含更新)
"""
四、核心功能
1. 断点续传支持
def has_today_data(self, code, target_date=None):
"""检查是否已有指定日期数据,用于跳过重复获取"""
2. 数据查询接口
方法 功能 get_daily_data() 获取日线数据 get_analysis_history() 查询分析历史 get_recent_news() 获取近期新闻 get_latest_analysis_by_query_id() 根据查询ID获取最新分析
3. 数据保存接口
方法 功能 save_daily_data() 批量保存日线数据 save_analysis_history() 保存分析结果 save_news_intel() 保存新闻情报 save_fundamental_snapshot() 保存基本面快照
五、并发安全设计
1. WAL 模式
- 支持多个读操作和一个写操作同时进行
- 提高并发性能
2. 写锁机制
session.connection().exec_driver_sql("BEGIN IMMEDIATE")
- 在写事务开始时立即获取写锁
- 确保预检查和写入在同一事务窗口内
3. 锁冲突重试
- 检测 SQLite "database is locked" 错误
- 自动指数退避重试
六、数据层特点
1. 轻量级存储
- SQLite 单文件存储,无需额外数据库服务
- 适合单机部署和桌面应用
2. 事务保证
- ACID 事务支持
- 自动重试机制确保数据一致性
3. 断点续传
- 自动检测已存在数据,跳过重复获取
- 提高分析效率
4. 并发安全
- WAL 模式支持并发读写
- 写锁和重试机制避免数据竞争
5. 自动建表
- 首次运行自动创建所有表结构和索引
- 无需手动维护 schema
七、总结
数据层采用 SQLite + SQLAlchemy 技术栈,具有以下核心特点:
- 单例模式 :全局共享数据库连接,避免资源浪费
- WAL 模式 :支持高效并发读写
- 批量 UPSERT :高效的数据更新策略
- 事务重试 :自动处理锁冲突,保证数据一致性
- 断点续传 :智能跳过已存在数据,提升效率
- 多表设计 :合理的数据模型划分,支持分析历史、回测、组合管理等功能 整体设计兼顾了轻量级部署、高性能并发和数据完整性需求。