Fixed replica logic.

This commit is contained in:
Mike Cao 2025-12-03 17:05:14 -08:00
parent 33cb195fd0
commit c427c6f547

View file

@ -206,6 +206,10 @@ async function rawQuery(sql: string, data: Record<string, any>, 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<typeof getClient>;
export default {
client,