瀏覽代碼

Fix migrations ordering

Owen Schwartz 5 月之前
父節點
當前提交
57cd776c34
共有 1 個文件被更改,包括 32 次插入22 次删除
  1. 32 22
      server/setup/migrations.ts

+ 32 - 22
server/setup/migrations.ts

@@ -3,9 +3,9 @@ import db, { exists } from "@server/db";
 import path from "path";
 import semver from "semver";
 import { versionMigrations } from "@server/db/schema";
-import { desc } from "drizzle-orm";
 import { __DIRNAME } from "@server/lib/consts";
 import { loadAppVersion } from "@server/lib/loadAppVersion";
+import { SqliteError } from "better-sqlite3";
 import m1 from "./scripts/1.0.0-beta1";
 import m2 from "./scripts/1.0.0-beta2";
 import m3 from "./scripts/1.0.0-beta3";
@@ -53,38 +53,44 @@ export async function runMigrations() {
             }
 
             await db
-            .insert(versionMigrations)
-            .values({
-                version: appVersion,
-                executedAt: Date.now()
-            })
-            .execute();
+                .insert(versionMigrations)
+                .values({
+                    version: appVersion,
+                    executedAt: Date.now()
+                })
+                .execute();
         }
     } catch (e) {
         console.error("Error running migrations:", e);
-        await new Promise((resolve) => setTimeout(resolve, 1000 * 60 * 60 * 24 * 1));
+        await new Promise((resolve) =>
+            setTimeout(resolve, 1000 * 60 * 60 * 24 * 1)
+        );
     }
 }
 
 async function executeScripts() {
     try {
         // Get the last executed version from the database
-        const lastExecuted = await db
-            .select()
-            .from(versionMigrations)
-            .orderBy(desc(versionMigrations.version))
-            .limit(1);
+        const lastExecuted = await db.select().from(versionMigrations);
 
-        const startVersion = lastExecuted[0]?.version ?? "0.0.0";
+        // Filter and sort migrations
+        const pendingMigrations = lastExecuted
+            .map((m) => m)
+            .sort((a, b) => semver.compare(b.version, a.version));
+        const startVersion = pendingMigrations[0]?.version ?? "0.0.0";
         console.log(`Starting migrations from version ${startVersion}`);
 
-        // Filter and sort migrations
-        const pendingMigrations = migrations
-            .filter((migration) => semver.gt(migration.version, startVersion))
-            .sort((a, b) => semver.compare(a.version, b.version));
+        const migrationsToRun = migrations.filter((migration) =>
+            semver.gt(migration.version, startVersion)
+        );
+
+        console.log(
+            "Migrations to run:",
+            migrationsToRun.map((m) => m.version).join(", ")
+        );
 
         // Run migrations in order
-        for (const migration of pendingMigrations) {
+        for (const migration of migrationsToRun) {
             console.log(`Running migration ${migration.version}`);
 
             try {
@@ -102,12 +108,16 @@ async function executeScripts() {
                 console.log(
                     `Successfully completed migration ${migration.version}`
                 );
-            } catch (error) {
+            } catch (e) {
+                if (e instanceof SqliteError && e.code === "SQLITE_CONSTRAINT_UNIQUE") {
+                    console.error("Migration has already run! Skipping...");
+                    continue;
+                }
                 console.error(
                     `Failed to run migration ${migration.version}:`,
-                    error
+                    e
                 );
-                throw error; // Re-throw to stop migration process
+                throw e; // Re-throw to stop migration process
             }
         }