Files
autoclip/docs/DATA_STORAGE_FIX.md
2025-08-21 01:05:23 +08:00

4.9 KiB
Raw Blame History

数据存储问题修复文档

问题描述

前端显示0个切片和0个合集但实际的处理流程已经成功完成生成了视频文件和元数据文件。

问题原因

  1. 数据存储逻辑未被调用Pipeline适配器中有完整的数据存储逻辑_save_clips_to_database_save_collections_to_database但在ProcessingOrchestrator的execute_pipeline方法中没有被调用。

  2. 架构设计问题ProcessingOrchestrator只负责执行流水线步骤但没有负责将结果保存到数据库。

  3. 数据分离存储模式:系统采用了分离存储模式,将完整数据保存在文件系统中,数据库中只保存元数据和路径引用,但数据存储逻辑没有被正确触发。

解决方案

1. 修复ProcessingOrchestrator

execute_pipeline方法的最后添加数据存储逻辑:

def execute_pipeline(self, srt_path: Path, steps_to_execute: Optional[List[ProcessingStep]] = None) -> Dict[str, Any]:
    # ... 执行流水线步骤 ...
    
    # 流水线执行完成,保存数据到数据库
    self._save_pipeline_results_to_database(results)
    
    # 更新任务状态为完成
    self._update_task_status(TaskStatus.COMPLETED, progress=100)

2. 添加数据存储方法

在ProcessingOrchestrator中添加_save_pipeline_results_to_database方法:

def _save_pipeline_results_to_database(self, results: Dict[str, Any]):
    """将流水线执行结果保存到数据库"""
    try:
        logger.info(f"开始保存项目 {self.project_id} 流水线结果到数据库")
        
        # 获取项目目录
        project_dir = self.adapter.data_dir / "projects" / self.project_id
        
        # 保存切片数据到数据库
        step4_result = results.get('step4_title', {}).get('result', [])
        if step4_result:
            logger.info(f"保存 {len(step4_result)} 个切片到数据库")
            self.adapter._save_clips_to_database(self.project_id, project_dir / "step4_title" / "step4_title.json")
        
        # 保存合集数据到数据库
        step5_result = results.get('step5_clustering', {}).get('result', [])
        if step5_result:
            logger.info(f"保存 {len(step5_result)} 个合集到数据库")
            self.adapter._save_collections_to_database(self.project_id, project_dir / "step5_clustering" / "step5_clustering.json")
        
        logger.info(f"项目 {self.project_id} 流水线结果已全部保存到数据库")
        
    except Exception as e:
        logger.error(f"保存流水线结果到数据库失败: {e}")
        # 不抛出异常,避免影响整个流水线的完成状态

3. 创建修复脚本

创建scripts/fix_data_storage.py脚本来手动修复已存在的项目:

def fix_project_data_storage(project_id: str):
    """修复项目数据存储"""
    # 创建Pipeline适配器
    adapter = PipelineAdapter(db, None, project_id)
    
    # 保存切片数据到数据库
    adapter._save_clips_to_database(project_id, clips_file)
    
    # 保存合集数据到数据库
    adapter._save_collections_to_database(project_id, collections_file)

修复结果

修复前

  • 数据库中的切片数量: 0
  • 数据库中的合集数量: 0
  • 前端显示: 0个切片0个合集

修复后

  • 数据库中的切片数量: 6
  • 数据库中的合集数量: 1
  • 前端显示: 6个切片1个合集

数据详情

切片数据

  1. "AI不会取代你但会用AI的'超级个体'会碾压你" (评分: 0.96)
  2. "AI让经验失效却让这项能力变得前所未有地重要" (评分: 0.95)
  3. "未来十年真正抗风险的能力,不在技能,而在判断" (评分: 0.94)
  4. "AI创业正进入大学生时代这届年轻人开始弯道超车" (评分: 0.93)
  5. "所谓的非共识,不过是小圈子的共识" (评分: 0.88)
  6. "投资人和程序员眼中的MCP为何天差地别" (评分: 0.82)

合集数据

  • "职场成长记" - 探讨职业发展、技能提升与职场心态变化。

使用方法

修复现有项目

python scripts/fix_data_storage.py --project-id <项目ID>

仅检查数据

python scripts/fix_data_storage.py --project-id <项目ID> --check-only

预防措施

  1. 自动化修复:在项目处理完成后自动触发数据存储
  2. 数据验证:在处理完成后验证数据库中的数据完整性
  3. 错误处理:改进错误处理机制,确保数据存储失败不会影响整个流水线
  4. 监控告警:添加监控机制,及时发现数据存储问题

相关文件

  • backend/services/processing_orchestrator.py - 处理编排器
  • backend/services/pipeline_adapter.py - 流水线适配器
  • backend/services/storage_service.py - 存储服务
  • scripts/fix_data_storage.py - 数据存储修复脚本
  • backend/models/clip.py - 切片模型
  • backend/models/collection.py - 合集模型