diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 94970584..06336d3b 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -206,6 +206,10 @@ async function rawQuery(sql: string, data: Record, name?: string): return `$${params.length}${type ?? ''}`; }); + if (process.env.DATABASE_REPLICA_URL && '$replica' in client) { + return client.$replica().$queryRawUnsafe(query, ...params); + } + return client.$queryRawUnsafe(query, ...params); } @@ -296,10 +300,6 @@ function getSchema() { } function getClient() { - if (!process.env.DATABASE_URL) { - return null; - } - const url = process.env.DATABASE_URL; const replicaUrl = process.env.DATABASE_REPLICA_URL; const logQuery = process.env.LOG_QUERY; @@ -307,43 +307,49 @@ function getClient() { const connectionUrl = new URL(url); const schema = connectionUrl.searchParams.get('schema') ?? undefined; - const adapter = new PrismaPg({ connectionString: url.toString() }, { schema }); + const baseAdapter = new PrismaPg({ connectionString: url }, { schema }); - const prisma = new PrismaClient({ - adapter, + const baseClient = new PrismaClient({ + adapter: baseAdapter, errorFormat: 'pretty', ...(logQuery ? PRISMA_LOG_OPTIONS : {}), }); - if (replicaUrl) { - const replicaAdapter = new PrismaPg({ connectionString: replicaUrl.toString() }, { schema }); - - const replicaClient = new PrismaClient({ - adapter: replicaAdapter, - ...(logQuery ? PRISMA_LOG_OPTIONS : {}), - }); - - prisma.$extends( - readReplicas({ - replicas: [replicaClient], - }), - ); + if (logQuery) { + baseClient.$on('query', log); } + if (!replicaUrl) { + log('Prisma initialized'); + globalThis[PRISMA] ??= baseClient; + return baseClient; + } + + const replicaAdapter = new PrismaPg({ connectionString: replicaUrl }, { schema }); + + const replicaClient = new PrismaClient({ + adapter: replicaAdapter, + errorFormat: 'pretty', + ...(logQuery ? PRISMA_LOG_OPTIONS : {}), + }); + if (logQuery) { - prisma.$on('query' as never, log); + replicaClient.$on('query', log); } - log('Prisma initialized'); + const extended = baseClient.$extends( + readReplicas({ + replicas: [replicaClient], + }), + ); - if (!globalThis[PRISMA]) { - globalThis[PRISMA] = prisma; - } + log('Prisma initialized (with replica)'); + globalThis[PRISMA] ??= extended; - return prisma; + return extended; } -const client: PrismaClient = globalThis[PRISMA] || getClient(); +const client = (globalThis[PRISMA] || getClient()) as ReturnType; export default { client,