// Author: |7eter l-|. l3oling // License: MIT // Copyright: 2024 // See: https://gist.github.com/pboling/f831235a1f3c5627f0341c4bbcf37ea9 // Inspired by https://gist.github.com/RavenHursT/1dd87fb3460183b02ed1cf1dba065de8 /* Usage: 1. Add pre-requisites: pnpm add -D pgtools pnpm add -D dotenv 2. Add to `package.json`: ``` "scripts": { "db:reset": "tsx src/lib/db/db_reset.server.ts", "db:setup": "pnpm db:reset && pnpm db:migrate", "db:studio": "drizzle-kit studio --config drizzle.config.ts", "db:generate": "drizzle-kit generate:pg --config drizzle.config.ts", "db:migrate": "drizzle-kit push:pg --config drizzle.config.ts", "db:squash": "rm -rf migrations/* && pnpm db:generate && pnpm db:setup && pnpm db:migrate" } ``` */ import pgtools from 'pgtools'; // We can't use svelte env vars here because migrations run without loading svelte or vite. import * as dotenv from 'dotenv'; dotenv.config({}); const DATABASE_NAME = process.env.DATABASE_NAME ?? 'demo-db'; // When used by createdb / dropdb the database name at the end of DATABASE_URL // is ignored and replaced with the default postgres database const DATABASE_URL = process.env.DATABASE_URL ?? 'postgres://localhost:5432/demo-db'; if (!DATABASE_URL) { throw new Error('No url for Scripting SQL'); } else { console.log('Database URL is:', DATABASE_URL); } async function dropDatabase() { // Drop it if it already exists await pgtools.dropdb(DATABASE_URL, DATABASE_NAME); } async function createDatabase() { // Then create a new database await pgtools.createdb(DATABASE_URL, DATABASE_NAME); } function handleDropErrors(err: { message: string | string[] }) { if (err.message.indexOf(`does not exist`) === -1) { throw err; } else { console.log('Cold Start Detected! Database does not exist...'); createDatabase().then(() => { console.log('Database created!'); }); } } dropDatabase() .then(() => { console.log('Database dropped!'); createDatabase().then(() => { console.log('Database created!'); }); }) .catch(handleDropErrors);