From 9889d20edd5f0bc339665df2b0eb2bf49b3edd89 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Thu, 14 May 2026 16:21:02 +0700 Subject: [PATCH] feat: add programmatic migration runner for better PostgreSQL support --- package.json | 1 + src/database/migrate.ts | 48 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/database/migrate.ts diff --git a/package.json b/package.json index 71c3ce2..c9ac9da 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "test": "vitest run", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", + "db:migrate:programmatic": "tsx src/database/migrate.ts", "db:studio": "drizzle-kit studio" }, "dependencies": { diff --git a/src/database/migrate.ts b/src/database/migrate.ts new file mode 100644 index 0000000..14fe606 --- /dev/null +++ b/src/database/migrate.ts @@ -0,0 +1,48 @@ +import "dotenv/config"; +import { migrate } from "drizzle-orm/node-postgres/migrator"; +import { migrate as migrateSqlite } from "drizzle-orm/better-sqlite3/migrator"; +import { initializeDatabase } from "./drizzle"; +import { config } from "../config"; +import { createChildLogger } from "../logger"; +import Database from "better-sqlite3"; + +const logger = createChildLogger("migrate"); + +export async function runMigrations(): Promise { + try { + logger.info("Starting database migrations"); + + if (config.DATABASE_TYPE === "postgres") { + logger.info("Running PostgreSQL migrations"); + const db = await initializeDatabase(); + await migrate(db as any, { migrationsFolder: "./drizzle/migrations" }); + logger.info("PostgreSQL migrations completed successfully"); + } else { + logger.info("Running SQLite migrations"); + const sqlite = new Database(".muxer-queue.db"); + sqlite.pragma("journal_mode = WAL"); + const db = require("drizzle-orm/better-sqlite3").drizzle(sqlite); + migrateSqlite(db, { migrationsFolder: "./drizzle/migrations" }); + logger.info("SQLite migrations completed successfully"); + } + } catch (error) { + logger.error( + { error: error instanceof Error ? error.message : String(error) }, + "Migration failed" + ); + throw error; + } +} + +// Run migrations if called directly +if (require.main === module) { + runMigrations() + .then(() => { + logger.info("Migrations completed"); + process.exit(0); + }) + .catch((error) => { + logger.error({ error }, "Migration failed"); + process.exit(1); + }); +}