From d0fddb56d7925599e5b5e260edfc158380b238df Mon Sep 17 00:00:00 2001 From: mkelvers Date: Wed, 8 Apr 2026 13:12:55 +0200 Subject: [PATCH] fix: gracefully ignore duplicate columns during migration so it recovers from old manual applies --- internal/database/migrate.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/internal/database/migrate.go b/internal/database/migrate.go index 34572e9..a8cd961 100644 --- a/internal/database/migrate.go +++ b/internal/database/migrate.go @@ -2,10 +2,12 @@ package database import ( "database/sql" + "fmt" "log" "os" "path/filepath" "sort" + "strings" ) func RunMigrations(db *sql.DB) error { @@ -44,8 +46,24 @@ func RunMigrations(db *sql.DB) error { if err != nil { return err } - if _, err := db.Exec(string(migrationSQL)); err != nil { - return err + + // Split by statement and execute one by one + statements := strings.Split(string(migrationSQL), ";") + for _, stmt := range statements { + stmt = strings.TrimSpace(stmt) + if stmt == "" { + continue + } + + if _, err := db.Exec(stmt); err != nil { + errStr := err.Error() + // Safely ignore duplicate columns/tables caused by old manual sqlite3 runs + if strings.Contains(errStr, "duplicate column name") || strings.Contains(errStr, "already exists") { + log.Printf("warning: ignoring expected error in %s: %v", migrationFile, err) + } else { + return fmt.Errorf("failed to execute statement in %s: %v\nStatement: %s", migrationFile, err, stmt) + } + } } // Mark as applied