PCM_Report/test_db_migration.py

132 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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)