// migrate-to-postgres.ts import { sql } from "drizzle-orm"; import { db as pgDb, getConnectionDetails } from "./drizzle"; import { db as sqliteDb, databaseUrl } from "./drizzle-sqlite"; import * as schema from "./schema"; import { pgDump, pgRestore } from "pg-dump-restore"; import serverConfig from "@lifetracker/shared/config"; export async function migrateData() { // First back up existing pg data const filename = `${serverConfig.dataDir}/pg-backup-${new Date().getTime()}.sql`; const { stdout, stderr } = await pgDump(getConnectionDetails(), { filePath: `${filename}`, }); console.log("Backed up existing data to ", filename); console.log(stdout); console.log(`Using sqlite db: ${databaseUrl}`); const tables = { "users": schema.users, // "apiKeys": schema.apiKeys, // "colors": schema.colors, // "categories": schema.categories, // "days": schema.days, // "hours": schema.hours, // "metrics": schema.metrics, // "measurements": schema.measurements, }; // console.log(await sqliteDb.select().from(schema.apiKeys)); // For each table in your schema, transfer the data for (const tableName of Object.keys(tables)) { const oldData = await sqliteDb.query[tableName].findMany(); console.log(`Table: ${tableName}`); var skippedRecords = 0; var migratedRecords = 0; for (const record of oldData) { if ((await pgDb.select().from(tables[tableName]).where(sql`${tables[tableName].id} = ${record.id}`)).length == 0) { await pgDb.insert(tables[tableName]).values({ ...record, createdAt: new Date(), }); migratedRecords++; } else { skippedRecords++; } } console.log(`Migrated ${migratedRecords} records (skipped ${skippedRecords}) from ${tableName}\n`); } console.log("Migration complete!"); } migrateData().catch(console.error);