feat: support optional read replicas (#2540)

This commit is contained in:
Lucas Smith
2026-02-25 19:07:02 +11:00
committed by GitHub
parent c112392da9
commit 6f5014a561
5 changed files with 38 additions and 3 deletions
+23 -1
View File
@@ -1,5 +1,6 @@
/// <reference types="@documenso/prisma/types/types.d.ts" />
import { PrismaClient } from '@prisma/client';
import { readReplicas } from '@prisma/extension-read-replicas';
import { Kysely, PostgresAdapter, PostgresIntrospector, PostgresQueryCompiler } from 'kysely';
import kyselyExtension from 'prisma-extension-kysely';
@@ -7,7 +8,7 @@ import type { DB } from './generated/types';
import { getDatabaseUrl } from './helper';
import { remember } from './utils/remember';
export const prisma = remember(
const prisma = remember(
'prisma',
() =>
new PrismaClient({
@@ -65,4 +66,25 @@ export const prismaWithLogging = remember('prismaWithLogging', () => {
return client;
});
export const prismaWithReplicas = remember('prismaWithReplicas', () => {
if (!process.env.NEXT_PRIVATE_DATABASE_REPLICA_URLS) {
return prisma;
}
const replicaUrls = process.env.NEXT_PRIVATE_DATABASE_REPLICA_URLS.split(',').map((url) =>
url.trim(),
);
// !: Nasty hack, means we can't do any fancy $primary/$replica queries
// !: but it is acceptable since not all setups will have replicas anyway.
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
return prisma.$extends(
readReplicas({
url: replicaUrls,
}),
) as unknown as typeof prisma;
});
export { prismaWithReplicas as prisma };
export { sql } from 'kysely';