diff --git a/electron/main/database/core.ts b/electron/main/database/core.ts index 8a3f1ef..2bf4d83 100644 --- a/electron/main/database/core.ts +++ b/electron/main/database/core.ts @@ -451,18 +451,33 @@ export function checkMigrationNeeded(): { } /** - * 执行所有数据库的迁移 - * @returns 迁移结果 + * 迁移失败的数据库信息 */ -export function migrateAllDatabases(): { success: boolean; migratedCount: number; error?: string } { +interface MigrationFailure { + sessionId: string + error: string +} + +/** + * 执行所有数据库的迁移 + * 即使部分数据库迁移失败,也会继续处理其他数据库 + * @returns 迁移结果,包含成功数量和失败列表 + */ +export function migrateAllDatabases(): { + success: boolean + migratedCount: number + failures: MigrationFailure[] + error?: string +} { const { sessionIds, forceRepairIds } = checkMigrationNeeded() const forceRepairSet = new Set(forceRepairIds) if (sessionIds.length === 0) { - return { success: true, migratedCount: 0 } + return { success: true, migratedCount: 0, failures: [] } } let migratedCount = 0 + const failures: MigrationFailure[] = [] for (const sessionId of sessionIds) { try { @@ -473,14 +488,22 @@ export function migrateAllDatabases(): { success: boolean; migratedCount: number migratedCount++ } } catch (error) { - console.error(`[Database] Failed to migrate ${sessionId}:`, error) - return { - success: false, - migratedCount, - error: `迁移 ${sessionId} 失败: ${error instanceof Error ? error.message : String(error)}`, - } + const errorMessage = error instanceof Error ? error.message : String(error) + console.error(`[Database] Failed to migrate ${sessionId}:`, errorMessage) + failures.push({ sessionId, error: errorMessage }) } } - return { success: true, migratedCount } + // 如果有失败的数据库,返回部分成功状态 + if (failures.length > 0) { + const failedIds = failures.map((f) => f.sessionId.split('_').slice(-1)[0]).join(', ') + return { + success: false, + migratedCount, + failures, + error: `${failures.length} 个数据库迁移失败(ID: ${failedIds})。建议在侧边栏中删除这些损坏的会话。`, + } + } + + return { success: true, migratedCount, failures: [] } } diff --git a/electron/main/database/migrations.ts b/electron/main/database/migrations.ts index 3069f4e..7f741a4 100644 --- a/electron/main/database/migrations.ts +++ b/electron/main/database/migrations.ts @@ -179,6 +179,31 @@ function setSchemaVersion(db: Database.Database, version: number): void { db.prepare('UPDATE meta SET schema_version = ?').run(version) } +/** + * 检查数据库结构是否完整(meta 表必须存在) + * 如果 meta 表不存在,说明数据库损坏或不完整 + */ +function checkDatabaseIntegrity(db: Database.Database): { valid: boolean; error?: string } { + try { + const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='meta'").all() as Array<{ + name: string + }> + + if (tables.length === 0) { + return { + valid: false, + error: '数据库结构不完整:缺少 meta 表。建议删除此数据库文件后重新导入。', + } + } + return { valid: true } + } catch (error) { + return { + valid: false, + error: `数据库检查失败: ${error instanceof Error ? error.message : String(error)}`, + } + } +} + /** * 执行数据库迁移 * 自动检测当前版本并执行所有需要的迁移 @@ -186,8 +211,15 @@ function setSchemaVersion(db: Database.Database, version: number): void { * @param db 数据库连接 * @param forceRepair 是否强制修复(即使版本号已是最新也重新执行迁移脚本) * @returns 是否执行了迁移 + * @throws 如果数据库结构不完整 */ export function migrateDatabase(db: Database.Database, forceRepair = false): boolean { + // 首先检查数据库结构完整性 + const integrity = checkDatabaseIntegrity(db) + if (!integrity.valid) { + throw new Error(integrity.error) + } + const currentVersion = getSchemaVersion(db) // 如果不是强制修复模式,检查版本号 diff --git a/src/i18n/locales/en-US/home.json b/src/i18n/locales/en-US/home.json index 46cf538..f267beb 100644 --- a/src/i18n/locales/en-US/home.json +++ b/src/i18n/locales/en-US/home.json @@ -45,6 +45,10 @@ "upgradeContent": "Upgrade content:", "upgradeNow": "Upgrade Now", "upgrading": "Upgrading...", - "failed": "Migration failed" + "failed": "Migration failed", + "partialFailed": "Some databases failed to upgrade", + "errorHint": "This is usually caused by corrupted database files. Please delete the failed sessions from the sidebar and re-import them.", + "close": "Close", + "retry": "Retry" } } diff --git a/src/i18n/locales/zh-CN/home.json b/src/i18n/locales/zh-CN/home.json index b53018d..04c721b 100644 --- a/src/i18n/locales/zh-CN/home.json +++ b/src/i18n/locales/zh-CN/home.json @@ -45,6 +45,10 @@ "upgradeContent": "本次升级内容:", "upgradeNow": "立即升级", "upgrading": "正在升级...", - "failed": "迁移失败" + "failed": "迁移失败", + "partialFailed": "部分数据库升级失败", + "errorHint": "这通常是因为数据库文件损坏。建议在侧边栏中删除失败的会话,然后重新导入。", + "close": "关闭", + "retry": "重试" } } diff --git a/src/pages/home/components/MigrationModal.vue b/src/pages/home/components/MigrationModal.vue index 2fc911b..1a17b44 100644 --- a/src/pages/home/components/MigrationModal.vue +++ b/src/pages/home/components/MigrationModal.vue @@ -1,5 +1,5 @@