VWED_server/scripts/fix_instance_ids.py

83 lines
2.3 KiB
Python
Raw Normal View History

2025-04-30 16:57:46 +08:00
#!/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()