Hoang Nguyen
init app
f75d7fa
import path from 'node:path';
import * as schema from '@/models/Schema';
import { PGlite } from '@electric-sql/pglite';
import { drizzle as drizzlePg } from 'drizzle-orm/node-postgres';
import { migrate as migratePg } from 'drizzle-orm/node-postgres/migrator';
import { drizzle as drizzlePglite, type PgliteDatabase } from 'drizzle-orm/pglite';
import { migrate as migratePglite } from 'drizzle-orm/pglite/migrator';
import { PHASE_PRODUCTION_BUILD } from 'next/dist/shared/lib/constants';
import { Client } from 'pg';
import { Env } from './Env';
let client;
let drizzle;
if (process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD && Env.DATABASE_URL) {
client = new Client({
connectionString: Env.DATABASE_URL,
});
await client.connect();
drizzle = drizzlePg(client, { schema });
await migratePg(drizzle, {
migrationsFolder: path.join(process.cwd(), 'migrations'),
});
} else {
// Stores the db connection in the global scope to prevent multiple instances due to hot reloading with Next.js
const global = globalThis as unknown as { client: PGlite; drizzle: PgliteDatabase<typeof schema> };
if (!global.client) {
global.client = new PGlite();
await global.client.waitReady;
global.drizzle = drizzlePglite(global.client, { schema });
}
drizzle = global.drizzle;
await migratePglite(global.drizzle, {
migrationsFolder: path.join(process.cwd(), 'migrations'),
});
}
export const db = drizzle;