lifetracker/packages/db/migrate-to-postgres.ts
2025-01-31 18:09:27 -08:00

64 lines
2.0 KiB
TypeScript

// 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);