mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-04-29 16:22:43 +08:00
feat: 优化迁移表逻辑
This commit is contained in:
@@ -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: [] }
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
// 如果不是强制修复模式,检查版本号
|
||||
|
||||
Reference in New Issue
Block a user