mirror of
https://github.com/Hessenuk/DiscordTickets.git
synced 2025-09-05 17:51:27 +03:00
feat: super fast database dump and restore scripts
This commit is contained in:
51
scripts/restore.mjs
Normal file
51
scripts/restore.mjs
Normal file
@@ -0,0 +1,51 @@
|
||||
import { config } from 'dotenv';
|
||||
import { program } from 'commander';
|
||||
import fse from 'fs-extra';
|
||||
import { join } from 'path';
|
||||
import ora from 'ora';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
config();
|
||||
|
||||
program
|
||||
.requiredOption('-f, --file <path>', 'the path of the dump to import')
|
||||
.requiredOption('-y, --yes', 'yes, DELETE EVERYTHING in the database');
|
||||
|
||||
program.parse();
|
||||
|
||||
const options = program.opts();
|
||||
|
||||
let spinner = ora('Connecting').start();
|
||||
|
||||
const prisma_options = {};
|
||||
|
||||
if (process.env.DB_PROVIDER === 'sqlite' && !process.env.DB_CONNECTION_URL) {
|
||||
prisma_options.datasources = { db: { url: 'file:' + join(process.cwd(), './user/database.db') } };
|
||||
}
|
||||
|
||||
const prisma = new PrismaClient(prisma_options);
|
||||
|
||||
if (process.env.DB_PROVIDER === 'sqlite') {
|
||||
const { default: sqliteMiddleware } = await import('../src/lib/middleware/prisma-sqlite.js');
|
||||
prisma.$use(sqliteMiddleware);
|
||||
await prisma.$queryRaw`PRAGMA journal_mode=WAL;`;
|
||||
await prisma.$queryRaw`PRAGMA synchronous=normal;`;
|
||||
}
|
||||
|
||||
spinner.succeed('Connected');
|
||||
|
||||
spinner = ora(`Reading ${options.file}`).start();
|
||||
const dump = JSON.parse(await fse.promises.readFile(options.file, 'utf8'));
|
||||
spinner.succeed(`Parsed ${options.file}`);
|
||||
|
||||
// ! this order is important
|
||||
const queries = [
|
||||
prisma.guild.deleteMany(),
|
||||
prisma.user.deleteMany(),
|
||||
];
|
||||
|
||||
for (const [model, data] of dump) queries.push(prisma[model].createMany({ data }));
|
||||
spinner = ora('Importing').start();
|
||||
const [,, ...results] = await prisma.$transaction(queries);
|
||||
for (const idx in results) spinner.succeed(`Imported ${results[idx].count} into ${dump[idx][0]}`);
|
||||
process.exit(0);
|
Reference in New Issue
Block a user