From ca9413e665cc1bd78214ee822592c887e5f058e5 Mon Sep 17 00:00:00 2001 From: mineseo-kim Date: Thu, 9 Apr 2026 09:45:10 +0900 Subject: [PATCH] fix(db): honor DATABASE_URL schema for pg Pool and PrismaPg node-postgres ignores Prisma's ?schema= query param, so connections defaulted to public. Parse the schema from the URL, set search_path on the pool, and pass schema to PrismaPg (see prisma/prisma#28611). Made-with: Cursor --- src/database/index.ts | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/database/index.ts b/src/database/index.ts index 474e501..2bc929b 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -1,11 +1,36 @@ +import type { PoolConfig } from 'pg'; import { Pool } from 'pg'; import { PrismaPg } from '@prisma/adapter-pg'; import { PrismaClient } from '@prisma/client'; +import { env } from '../config/env'; import { logger } from '../utils/logger'; -// Prisma 7 requires a driver adapter for direct database connections. -const pool = new Pool({ connectionString: process.env.DATABASE_URL }); -const adapter = new PrismaPg(pool); +/** + * `?schema=` in DATABASE_URL is a Prisma URL extension. node-postgres does not apply it, + * so connections default to `search_path=public`. PrismaPg also needs an explicit schema + * option in some setups (see prisma/prisma#28611). + */ +function createPgPoolConfig(connectionString: string): { poolConfig: PoolConfig; prismaSchema?: string } { + if (!connectionString) { + return { poolConfig: { connectionString: '' } }; + } + try { + const url = new URL(connectionString); + const schema = url.searchParams.get('schema')?.trim(); + const poolConfig: PoolConfig = { connectionString }; + if (schema) { + const escaped = schema.replace(/"/g, '""'); + poolConfig.options = `-c search_path="${escaped}"`; + } + return { poolConfig, prismaSchema: schema || undefined }; + } catch { + return { poolConfig: { connectionString } }; + } +} + +const { poolConfig, prismaSchema } = createPgPoolConfig(env.DATABASE_URL); +const pool = new Pool(poolConfig); +const adapter = prismaSchema ? new PrismaPg(pool, { schema: prismaSchema }) : new PrismaPg(pool); export const prisma = new PrismaClient({ adapter,