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

4.7 KiB
Raw Blame History

数据库同步问题修复报告

问题描述

用户反馈每个任务执行完返回的视频数据都是不对的,看起来是读取了之前的老数据,没有正确返回。

问题分析

经过深入分析,发现了以下核心问题:

1. 数据库和文件系统不同步

  • 现象: 数据库中只有1个项目但文件系统中有30个项目目录
  • 原因: 新的处理流程使用数据库存储,但旧的项目数据还在文件系统中
  • 影响: 前端请求的项目ID在数据库中不存在导致返回空数据

2. 数据存储逻辑问题

  • 现象: 项目创建时只创建了文件系统目录,但没有同步到数据库
  • 原因: 项目创建逻辑没有正确地将数据保存到数据库
  • 影响: 前端无法获取到正确的项目数据

3. 数据同步缺失

  • 现象: 虽然有 DataSyncService,但没有正确执行
  • 原因: 同步逻辑不完整,没有处理已存在项目的情况
  • 影响: 文件系统中的数据无法正确同步到数据库

解决方案

1. 完善数据同步服务

创建了 DataSyncService 的完整实现:

class DataSyncService:
    def sync_all_projects_from_filesystem(self, data_dir: Path) -> Dict[str, Any]:
        """从文件系统同步所有项目到数据库"""
        
    def sync_project_from_filesystem(self, project_id: str, project_dir: Path) -> Dict[str, Any]:
        """从文件系统同步单个项目到数据库"""
        
    def _sync_clips_from_filesystem(self, project_id: str, project_dir: Path) -> int:
        """从文件系统同步切片数据"""
        
    def _sync_collections_from_filesystem(self, project_id: str, project_dir: Path) -> int:
        """从文件系统同步合集数据"""

2. 修复同步逻辑

关键修复点:

  1. 处理已存在项目: 即使项目已存在,也继续同步切片和合集数据
  2. 支持多种文件格式: 支持 step4_titles.jsonstep4_title.json 等多种文件命名
  3. 时间格式转换: 正确处理时间字符串到秒数的转换
  4. 错误处理: 完善的异常处理和日志记录

3. 创建修复脚本

创建了多个脚本来解决数据同步问题:

  • scripts/sync_all_projects.py: 同步所有项目数据
  • scripts/fix_all_projects.py: 修复所有项目的数据同步问题
  • scripts/test_sync.py: 测试特定项目的同步

修复结果

数据统计

修复后的数据库状态:

  • 项目总数: 30个
  • 切片总数: 61个
  • 合集总数: 5个

成功同步的项目

有数据的项目列表:

  • 21d3e619-f071-41ae-88f0-a85992596f57: 6个切片, 1个合集
  • 803de13d-9755-400c-a692-7b75eddf3723: 5个切片
  • 6e4d73a7-06c3-4036-904f-3daa3066a22b: 6个切片
  • 7c10aa86-2031-4b4a-94ad-cbd259ccf794: 8个切片, 3个合集
  • 1aeb9930-f926-4ce9-8879-71f021ad3910: 5个切片
  • 9f664fe6-8e43-4f88-8af0-d074ea0a14bb: 7个切片
  • 419d459e-c1c1-4e59-8476-6372eeef118b: 5个切片
  • 2eb44ba1-7e76-4ebc-83ca-7ee193bc5fcf: 7个切片, 1个合集
  • 1fdb0bf1-7f3c-44f7-a69d-90c5a1d26fbe: 5个切片
  • 88f8f751-11ae-4ae1-b618-6117d222869e: 5个切片
  • 其他项目: 各1个切片

API验证

测试API返回结果

curl "http://localhost:8000/api/v1/clips/?project_id=1fdb0bf1-7f3c-44f7-a69d-90c5a1d26fbe"

返回了正确的5个切片数据包含完整的元数据信息。

预防措施

1. 数据一致性检查

建议定期运行数据一致性检查:

python scripts/sync_all_projects.py status

2. 自动化同步

在项目处理完成后,自动触发数据同步:

# 在ProcessingOrchestrator中添加
def _save_step_result(self, step: ProcessingStep, result: Any):
    """保存步骤结果到数据库"""
    # 保存到数据库
    self._save_step_result_to_db(step, result)
    
    # 同步文件系统数据到数据库
    if step == ProcessingStep.STEP6_VIDEO:
        self._sync_project_data_to_db()

3. 监控和告警

添加数据一致性监控:

def check_data_consistency(self):
    """检查数据一致性"""
    # 检查数据库和文件系统的数据是否一致
    # 如果不一致,自动触发同步

总结

通过完善数据同步服务、修复同步逻辑和创建修复脚本成功解决了数据库和文件系统不同步的问题。现在所有项目的数据都正确存储在数据库中API能够正确返回最新的数据前端不再显示老数据。

这个解决方案确保了:

  1. 数据一致性: 数据库和文件系统数据保持同步
  2. 数据完整性: 所有项目、切片、合集数据都正确保存
  3. API正确性: 前端能够获取到正确的数据
  4. 可维护性: 提供了完整的同步和修复工具