Files
aiartstudio/server/utils/prisma.ts
T
2026-04-26 00:39:28 +08:00

71 lines
1.9 KiB
TypeScript

import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import { PrismaClient } from "~~/app/generated/prisma/client";
const globalForPrisma = globalThis as unknown as {
prisma?: PrismaClient;
};
const databaseUrl = process.env.DATABASE_URL;
if (!databaseUrl) {
throw new Error("DATABASE_URL is required to initialize PrismaClient");
}
type MariaDbPoolConfig = Exclude<
ConstructorParameters<typeof PrismaMariaDb>[0],
string
>;
function getNumberParam(url: URL, name: string, fallback: number) {
const value = url.searchParams.get(name);
if (!value) {
return fallback;
}
const parsed = Number(value);
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
}
function createMariaDbConfig(urlString: string): MariaDbPoolConfig {
const url = new URL(urlString);
const database = decodeURIComponent(url.pathname.replace(/^\//, ""));
if (!url.hostname || !url.username || !database) {
throw new Error("DATABASE_URL must include host, user and database");
}
const port = url.port ? Number(url.port) : 3306;
if (!Number.isInteger(port) || port <= 0) {
throw new Error("DATABASE_URL port is invalid");
}
return {
host: url.hostname,
port,
user: decodeURIComponent(url.username),
password: decodeURIComponent(url.password),
database,
connectionLimit: getNumberParam(url, "connection_limit", 5),
acquireTimeout: getNumberParam(url, "pool_timeout", 30) * 1000,
connectTimeout: getNumberParam(url, "connect_timeout", 10) * 1000
};
}
const mariaDbConfig = createMariaDbConfig(databaseUrl);
const adapter = new PrismaMariaDb(mariaDbConfig, {
database: mariaDbConfig.database
});
/** Reuse PrismaClient during dev hot reloads so Nuxt does not create duplicate pools. */
export const prisma =
globalForPrisma.prisma ??
new PrismaClient({
adapter,
log: ["warn", "error"]
});
if (process.env.NODE_ENV !== "production") {
globalForPrisma.prisma = prisma;
}