From 9dc377e1d8a3ca85e733177f4bfe48188ad45c48 Mon Sep 17 00:00:00 2001 From: smartenok-ops Date: Sun, 3 May 2026 15:18:11 -0400 Subject: [PATCH] fix(migrations): treat duplicate-column ALTER as no-op (#1886) Integrated into release/v3.7.9 --- src/lib/db/migrationRunner.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/lib/db/migrationRunner.ts b/src/lib/db/migrationRunner.ts index fe0c9da856..714f5428a3 100644 --- a/src/lib/db/migrationRunner.ts +++ b/src/lib/db/migrationRunner.ts @@ -774,8 +774,23 @@ export function runMigrations(db: Database.Database, options?: { isNewDb?: boole console.log(`[Migration] Applied: ${migration.version}_${migration.name}`); } catch (err: unknown) { const message = err instanceof Error ? err.message : String(err); - console.error(`[Migration] FAILED: ${migration.version}_${migration.name} — ${message}`); - throw err; // Re-throw to prevent DB from starting in inconsistent state + // "duplicate column name" means the column already exists — end state achieved, mark applied. + if (message.includes("duplicate column name")) { + const applyMarkerOnly = db.transaction(() => { + db.prepare("INSERT OR IGNORE INTO _omniroute_migrations (version, name) VALUES (?, ?)").run( + migration.version, + migration.name + ); + }); + applyMarkerOnly(); + count++; + console.log( + `[Migration] Applied (column pre-exists): ${migration.version}_${migration.name}` + ); + } else { + console.error(`[Migration] FAILED: ${migration.version}_${migration.name} — ${message}`); + throw err; // Re-throw to prevent DB from starting in inconsistent state + } } }