stock/verify_kline_data.py

157 lines
4.5 KiB
Python

"""
验证K线数据更新结果
检查数据库中的K线数据是否成功保存
"""
import sys
import os
import logging
from sqlalchemy import func
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.storage.database import db_manager
from src.storage.stock_repository import StockRepository
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def verify_kline_data():
"""
验证K线数据更新结果
"""
try:
logger.info("开始验证K线数据更新结果...")
# 创建存储库
repository = StockRepository(db_manager.get_session())
logger.info("存储库创建成功")
# 检查股票基础信息表
stocks = repository.get_stock_basic_info()
logger.info(f"股票基础信息表: {len(stocks)}条记录")
if stocks:
# 显示前5只股票
logger.info("前5只股票信息:")
for i, stock in enumerate(stocks[:5]):
logger.info(f" {i+1}. {stock.code} - {stock.name}")
# 检查K线数据表
try:
kline_count = repository.session.query(repository.DailyKline).count()
logger.info(f"日K线数据表: {kline_count}条记录")
if kline_count > 0:
# 显示最新的5条K线数据
latest_kline = repository.session.query(repository.DailyKline).order_by(
repository.DailyKline.trade_date.desc()
).limit(5).all()
logger.info("最新的5条K线数据:")
for i, kline in enumerate(latest_kline):
logger.info(f" {i+1}. {kline.stock_code} - {kline.trade_date} - 收盘价: {kline.close_price}")
# 按股票代码统计K线数据
kline_by_stock = repository.session.query(
repository.DailyKline.stock_code,
func.count(repository.DailyKline.id).label('count')
).group_by(repository.DailyKline.stock_code).all()
logger.info("各股票的K线数据统计:")
for stat in kline_by_stock[:10]: # 显示前10只股票
logger.info(f" {stat.stock_code}: {stat.count}条记录")
if len(kline_by_stock) > 10:
logger.info(f" ... 还有{len(kline_by_stock) - 10}只股票")
except Exception as e:
logger.error(f"查询K线数据失败: {str(e)}")
kline_count = 0
# 检查财务报告表
try:
financial_count = repository.session.query(repository.FinancialReport).count()
logger.info(f"财务报告表: {financial_count}条记录")
except Exception as e:
logger.error(f"查询财务报告数据失败: {str(e)}")
financial_count = 0
# 检查数据源表
try:
datasource_count = repository.session.query(repository.DataSource).count()
logger.info(f"数据源表: {datasource_count}条记录")
except Exception as e:
logger.error(f"查询数据源表失败: {str(e)}")
datasource_count = 0
# 检查系统日志表
try:
log_count = repository.session.query(repository.SystemLog).count()
logger.info(f"系统日志表: {log_count}条记录")
except Exception as e:
logger.error(f"查询系统日志表失败: {str(e)}")
log_count = 0
# 汇总结果
logger.info("数据验证汇总:")
logger.info(f" 股票基础信息: {len(stocks)}")
logger.info(f" 日K线数据: {kline_count}")
logger.info(f" 财务报告: {financial_count}")
logger.info(f" 数据源: {datasource_count}")
logger.info(f" 系统日志: {log_count}")
return {
"success": True,
"stock_count": len(stocks),
"kline_count": kline_count,
"financial_count": financial_count,
"datasource_count": datasource_count,
"log_count": log_count
}
except Exception as e:
logger.error(f"验证K线数据异常: {str(e)}")
return {"success": False, "error": str(e)}
def main():
"""
主函数
"""
result = verify_kline_data()
if result["success"]:
logger.info("数据验证成功!")
print(f"验证结果: {result}")
if result["kline_count"] > 0:
print("✓ K线数据已成功保存到数据库")
print(f"✓ 共保存了{result['kline_count']}条K线数据")
else:
print("⚠ K线数据未保存到数据库")
if result["stock_count"] > 0:
print(f"✓ 股票基础信息: {result['stock_count']}")
else:
print("⚠ 没有股票基础信息")
else:
logger.error("数据验证失败!")
print(f"验证失败: {result.get('error')}")
return result
if __name__ == "__main__":
# 运行验证
result = main()
# 输出最终结果
if result.get("success", False):
print("\n数据验证完成!")
sys.exit(0)
else:
print("\n数据验证失败!")
sys.exit(1)