83 lines
2.3 KiB
Python
83 lines
2.3 KiB
Python
#!/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() |