64 lines
2.0 KiB
TypeScript
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);
|