#!/usr/bin/env python # -*- coding: utf-8 -*- """ 任务实例ID修复脚本 为所有现有的任务实例记录生成并设置instance_id 用法: python scripts/fix_instance_ids.py """ import os import sys import logging import uuid from sqlalchemy import text # 添加项目根目录到系统路径 sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) # 导入项目模块 from data.session import get_db from data.models.task_instance import TaskInstance # 设置日志 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", handlers=[ logging.StreamHandler(sys.stdout), # 输出到控制台 logging.FileHandler("fix_instance_ids.log") # 输出到文件 ] ) logger = logging.getLogger("fix_instance_ids") def fix_instance_ids(): """为所有现有的任务实例记录生成并设置instance_id""" try: # 获取数据库会话 db = next(get_db()) # 查询所有没有instance_id的任务实例记录 instances = db.query(TaskInstance).filter( (TaskInstance.instance_id == None) | (TaskInstance.instance_id == '') ).all() logger.info(f"发现 {len(instances)} 条没有instance_id的任务实例记录") # 为每条记录生成并设置instance_id for instance in instances: instance_id = str(uuid.uuid4()) instance.instance_id = instance_id logger.info(f"为任务实例 ID={instance.id} 设置instance_id={instance_id}") # 提交更改 db.commit() logger.info("所有任务实例记录的instance_id已更新") return True except Exception as e: logger.error(f"修复任务实例ID失败: {str(e)}") if 'db' in locals(): db.rollback() return False def main(): """主函数""" logger.info("开始修复任务实例ID...") # 修复任务实例ID success = fix_instance_ids() if success: logger.info("任务实例ID修复成功!") else: logger.error("任务实例ID修复失败!") # 根据修复结果设置退出码 sys.exit(0 if success else 1) if __name__ == "__main__": main()