132 lines
4.0 KiB
Python
132 lines
4.0 KiB
Python
#!/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)
|