#!/usr/bin/env python # -*- coding: utf-8 -*- """ 测试数据库迁移功能 """ import sqlite3 import shutil from pathlib import Path from db_migration import DatabaseMigration, initialize_database, get_database_info DB_PATH = Path(__file__).parent / "experiments.db" BACKUP_PATH = Path(__file__).parent / "experiments.db.test_backup" print("=" * 80) print("数据库迁移功能测试") print("=" * 80) # 1. 备份当前数据库 print("\n步骤 1: 备份当前数据库") if DB_PATH.exists(): shutil.copy(DB_PATH, BACKUP_PATH) print(f"✅ 已备份到: {BACKUP_PATH}") else: print("⚠️ 数据库文件不存在,将创建新数据库") # 2. 获取当前数据库信息 print("\n步骤 2: 当前数据库信息") if DB_PATH.exists(): info = get_database_info() if info: print(f" 版本: {info['version']}") print(f" 表数量: {len(info['tables'])}") for table in info['tables']: if table['name'] == 'experiments': print(f"\n experiments 表:") print(f" 列数: {table['column_count']}") print(f" 列名: {', '.join(table['columns'])}") else: print(" 数据库不存在") # 3. 测试迁移功能 print("\n步骤 3: 运行数据库初始化") print("-" * 80) success = initialize_database() print("-" * 80) if success: print("✅ 数据库初始化成功") else: print("❌ 数据库初始化失败") # 4. 验证迁移结果 print("\n步骤 4: 验证迁移结果") info = get_database_info() if info: print(f" 当前版本: {info['version']}") for table in info['tables']: if table['name'] == 'experiments': print(f"\n experiments 表:") print(f" 列数: {table['column_count']}") print(f" 列名:") for col in table['columns']: print(f" - {col}") # 检查必要字段 required_fields = [ 'id', 'work_order_no', 'config_json', 'start_ts', 'end_ts', 'is_paused', 'created_at', 'script_data' ] missing = [f for f in required_fields if f not in table['columns']] if missing: print(f"\n ⚠️ 缺失字段: {', '.join(missing)}") else: print(f"\n ✅ 所有必要字段都存在") # 5. 测试添加列功能 print("\n步骤 5: 测试添加列功能") migration = DatabaseMigration() migration.connect() # 测试添加一个测试列 test_column = "test_migration_column" print(f" 尝试添加测试列: {test_column}") if migration.column_exists("experiments", test_column): print(f" 列 {test_column} 已存在") else: success = migration.add_column("experiments", test_column, "TEXT", "test_value") if success: print(f" ✅ 成功添加列: {test_column}") # 验证 if migration.column_exists("experiments", test_column): print(f" ✅ 验证成功: 列已存在") else: print(f" ❌ 验证失败: 列不存在") # 删除测试列(通过重建表) print(f" 清理测试列...") # 注意:SQLite 不支持 DROP COLUMN,这里只是演示 # 实际使用中,测试列会保留在数据库中 else: print(f" ❌ 添加列失败") migration.close() # 6. 总结 print("\n" + "=" * 80) print("测试总结") print("=" * 80) final_info = get_database_info() if final_info: print(f"✅ 数据库版本: {final_info['version']}") print(f"✅ 表数量: {len(final_info['tables'])}") for table in final_info['tables']: if table['name'] == 'experiments': print(f"✅ experiments 表列数: {table['column_count']}") print("\n提示:") print(" - 原始数据库已备份到: experiments.db.test_backup") print(" - 如需恢复,请手动复制备份文件") print(" - 测试列 'test_migration_column' 已添加(如果之前不存在)") print("\n" + "=" * 80)