You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
8.2 KiB
8.2 KiB
Python 数据服务 Docker 化部署指南
概述
本指南介绍如何将 Python AKShare 数据服务 Docker 化部署,并连接 Docker 中的 MySQL 数据库。
架构图
┌─────────────────────────────────────────────────────────────────┐
│ Docker Network │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ MySQL │◄───┤ AKShare │ │ Node.js │ │
│ │ :3306 │ │ :8000 │◄───┤ :3000 │ │
│ │ │ │ │ │ │ │
│ │ aguzhitou │ │ 数据获取 │ │ API服务 │ │
│ │ │ │ 数据存储 │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ▲ │ │ │
│ │ │ │ │
│ ┌─────────────┐ │ │ │
│ │ Redis │◄──────────┴───────────────────┘ │
│ │ :6379 │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
数据表说明
Python 数据服务需要以下数据表:
1. 市场指数表 (market_indices)
- id: 主键
- name: 指数名称(如上证指数)
- code: 指数代码(如000001)
- current: 当前点位
- change: 涨跌额
- change_percent: 涨跌幅
- volume: 成交量
- turnover: 成交额
2. 板块信息表 (sectors)
- id: UUID主键
- name: 板块名称
- code: 板块代码
3. 板块行情表 (sector_quotes)
- id: 主键
- sector_code: 板块代码
- current/change/change_percent: 行情数据
- momentum_score: 动量分数
- rank/previous_rank: 排名信息
- quote_time: 行情时间
4. 板块K线数据表 (sector_klines)
- id: 主键
- sector_code: 板块代码
- period: 周期(day/week/month)
- date: 日期
- open/high/low/close/volume: K线数据
5. 股票信息表 (stocks) ⭐核心表
- id: UUID主键
- code: 股票代码(如000001)
- name: 股票名称
- sector_code: 所属板块
- market_cap: 市值
- pe/pb: 市盈率/市净率
6. 股票行情表 (stock_quotes) ⭐高频写入
- id: 主键
- stock_code: 股票代码
- price/open/high/low/pre_close: 价格数据
- volume/turnover: 成交数据
- change_percent: 涨跌幅
- turnover_rate/amplitude: 换手率/振幅
- quote_time: 行情时间
7. 股票K线数据表 (stock_klines) ⭐核心表
- id: 主键
- stock_code: 股票代码
- period: 周期
- date: 日期
- open/high/low/close/volume: K线数据
- ma5/ma10/ma20/ma30/ma60: 移动平均线
8. 新高新低记录表 (high_low_stocks)
- id: 主键
- stock_code: 股票代码
- type: high(新高) / low(新低)
- price: 触发价格
- date: 日期
- days_to_highlow: 距离前高/低天数
9. 动量股票推荐表 (momentum_stocks)
- id: 主键
- stock_code: 股票代码
- momentum_score: 动量分数(0-100)
- tags: 标签JSON(如["强势突破","量价齐升"])
- volume_ratio: 量比
- break_through: 是否突破
- date: 日期
快速启动
方式一:完整 Docker 部署(推荐)
cd app/backend
# 启动所有服务(MySQL + Redis + AKShare + Node.js后端)
docker-compose up -d
# 查看日志
docker-compose logs -f akshare
方式二:仅数据库 + Python 服务
cd app/backend
# 使用简化配置
docker-compose up -d mysql redis akshare
# 后端在宿主机运行(开发模式)
cd ../backend
npm install
npx prisma db push
npm run dev
服务地址
启动后各服务地址:
| 服务 | 容器内地址 | 宿主机访问地址 |
|---|---|---|
| MySQL | mysql:3306 | localhost:3306 |
| Redis | redis:6379 | localhost:6379 |
| AKShare | akshare:8000 | localhost:8000 |
| Node.js后端 | app:3000 | localhost:3000 |
Python 服务接口
原始数据接口(从AKShare实时获取)
GET /stock_zh_a_spot # A股实时行情
GET /stock_zh_a_hist # A股历史K线
GET /stock_zh_index_spot # 指数行情
GET /stock_sector_spot # 板块行情
数据库查询接口(从MySQL查询)
GET /db/stocks # 获取股票列表
GET /db/klines/{symbol} # 获取K线数据
数据同步接口
POST /sync/stocks # 同步股票列表
POST /sync/quotes # 同步实时行情
POST /sync/klines # 同步K线数据
POST /sync/all # 执行全量同步
POST /sync/daily # 执行每日增量同步
GET /sync/status # 获取同步状态
数据同步流程
首次部署 - 全量同步
# 1. 初始化数据库表
docker exec aguzhitou-akshare python -c "from database import init_db; init_db()"
# 2. 执行全量同步(快速模式,只同步少量数据测试)
curl -X POST http://localhost:8000/sync/all?quick=true
# 3. 查看同步状态
curl http://localhost:8000/sync/status
定时同步 - 增量更新
设置定时任务(crontab):
# 编辑 crontab
crontab -e
# 添加定时任务(每5分钟同步一次实时行情)
*/5 * * * 1-5 curl -X POST http://localhost:8000/sync/quotes > /dev/null 2>&1
# 每晚8点执行每日同步
0 20 * * 1-5 curl -X POST http://localhost:8000/sync/daily > /dev/null 2>&1
环境变量配置
Python 服务支持以下环境变量:
| 变量 | 说明 | 默认值 |
|---|---|---|
| DB_HOST | MySQL主机 | mysql |
| DB_PORT | MySQL端口 | 3306 |
| DB_NAME | 数据库名 | aguzhitou |
| DB_USER | 用户名 | root |
| DB_PASSWORD | 密码 | 1qazse42W3 |
数据量预估
| 表名 | 预估数据量 | 存储空间 |
|---|---|---|
| stocks | ~5000条 | ~1MB |
| stock_quotes | ~5000条/天 | ~500MB/年 |
| stock_klines | ~120万条/年 | ~2GB/年 |
| sector_klines | ~3万条/年 | ~50MB/年 |
| high_low_stocks | ~1万条/年 | ~10MB/年 |
| momentum_stocks | ~5000条/年 | ~5MB/年 |
常见问题
1. 数据库连接失败
# 检查MySQL是否运行
docker-compose ps mysql
# 查看MySQL日志
docker-compose logs mysql
# 测试连接
docker exec aguzhitou-akshare python -c "from database import check_connection; print(check_connection())"
2. 表不存在
如果使用 Prisma,执行:
cd app/backend
npx prisma db push
如果使用 SQL 脚本,执行:
docker exec -i aguzhitou-mysql mysql -uroot -p1qazse42W3 aguzhitou < app/backend/init-scripts/01-init-database.sql
3. 数据同步太慢
# 只同步部分股票(max_stocks参数)
curl -X POST "http://localhost:8000/sync/klines?max_stocks=100"
# 减少同步天数
curl -X POST "http://localhost:8000/sync/klines?days=30"
4. 清理旧数据
-- 清理3个月前的行情数据
DELETE FROM stock_quotes WHERE quote_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
-- 优化表空间
OPTIMIZE TABLE stock_quotes;
开发调试
进入 Python 容器
docker exec -it aguzhitou-akshare bash
# 测试数据同步
python -c "from data_sync import sync_all_stocks; sync_all_stocks()"
查看实时日志
docker-compose logs -f akshare --tail 100
重启服务
docker-compose restart akshare