PCM_Report/test_db_migration.py

132 lines
4.0 KiB
Python
Raw Normal View History

2025-12-11 14:32:31 +08:00
#!/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)