mirror of
https://github.com/zhouxiaoka/autoclip.git
synced 2026-05-06 22:13:00 +08:00
4.7 KiB
4.7 KiB
数据库同步问题修复报告
问题描述
用户反馈每个任务执行完返回的视频数据都是不对的,看起来是读取了之前的老数据,没有正确返回。
问题分析
经过深入分析,发现了以下核心问题:
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. 修复同步逻辑
关键修复点:
- 处理已存在项目: 即使项目已存在,也继续同步切片和合集数据
- 支持多种文件格式: 支持
step4_titles.json、step4_title.json等多种文件命名 - 时间格式转换: 正确处理时间字符串到秒数的转换
- 错误处理: 完善的异常处理和日志记录
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能够正确返回最新的数据,前端不再显示老数据。
这个解决方案确保了:
- 数据一致性: 数据库和文件系统数据保持同步
- 数据完整性: 所有项目、切片、合集数据都正确保存
- API正确性: 前端能够获取到正确的数据
- 可维护性: 提供了完整的同步和修复工具