#!/usr/bin/env python3 """整理测试类别 - 将现有项目归类到大类下""" import asyncio from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy import text DB_CONFIG = { 'host': '123.57.81.127', 'port': 3306, 'user': 'cpy_admin', 'password': 'Tgzz2025+', 'database': 'ruoyi-fastapi' } DATABASE_URL = ( f"mysql+asyncmy://{DB_CONFIG['user']}:{DB_CONFIG['password']}@" f"{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}" ) async def organize_categories(): engine = create_async_engine(DATABASE_URL, echo=False) async with engine.connect() as conn: print("=" * 80) print("Organize Test Categories") print("=" * 80) # 1. 查看现有大类 print("\n[1] Existing Test Categories (Level 1):") result = await conn.execute(text(""" SELECT id, name, category_code FROM test_category WHERE level = 1 ORDER BY id """)) rows = result.fetchall() if rows: for row in rows: print(f" ID:{row[0]} | {row[1]} | Code:{row[2]}") else: print(" No categories found") # 2. 查看未归类的项目 print("\n[2] Unassigned Test Items (Level 2 without parent):") result = await conn.execute(text(""" SELECT id, name, memo FROM test_category WHERE level = 2 AND (parent_id IS NULL OR parent_id = 0) ORDER BY name LIMIT 20 """)) rows = result.fetchall() for row in rows: print(f" ID:{row[0]} | {row[1]} | Memo:{row[2]}") # 3. 统计信息 print("\n[3] Statistics:") result = await conn.execute(text(""" SELECT COUNT(CASE WHEN level = 1 THEN 1 END) as category_count, COUNT(CASE WHEN level = 2 AND parent_id IS NOT NULL THEN 1 END) as assigned_items, COUNT(CASE WHEN level = 2 AND (parent_id IS NULL OR parent_id = 0) THEN 1 END) as unassigned_items FROM test_category """)) row = result.fetchone() print(f" Categories: {row[0]}") print(f" Assigned Items: {row[1]}") print(f" Unassigned Items: {row[2]}") print("\n" + "=" * 80) await engine.dispose() if __name__ == '__main__': asyncio.run(organize_categories())