跳至主要内容

Prisma ORM 与 Next.js 结合使用综合指南

Prisma ORM 和 Next.js 构成了一个强大的组合,用于构建现代的、服务器端渲染的以及 API 驱动的 Web 应用程序。本指南整合了各种技巧和策略,以帮助您最大化它们的潜力。无论您是寻找最佳实践、单体仓库设置指导,还是动态使用策略,我们都能满足您的需求。


在开发中使用 Prisma Client 的最佳实践

避免多个 Prisma Client 实例

在开发 Next.js 应用程序时,一个常见问题是意外地创建多个 Prisma Client 实例。这通常是由于 Next.js 在开发中的热重载功能造成的。

为什么会发生这种情况

Next.js 的热重载功能会频繁重载模块,以即时反映代码更改。然而,这可能导致创建多个 Prisma Client 实例,从而消耗资源并可能导致意外行为。

为避免这种情况,请使用全局变量创建单个 Prisma Client 实例。

// lib/prisma.ts
import { PrismaClient } from "../prisma/generated/client";

const globalForPrisma = global as unknown as { prisma: PrismaClient };

export const prisma =
globalForPrisma.prisma || new PrismaClient();

if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;

使用此方法可确保即使在开发中的热重载期间,也只有一个 Prisma Client 实例存在。


在单体仓库中设置 Prisma ORM

在单体仓库中使用 Prisma ORM 的挑战

单体仓库允许多个项目共享代码和依赖项,使其成为现代开发的流行选择。然而,在单体仓库中使用 Prisma ORM 可能会带来与依赖项解析和 Schema 管理相关的挑战。

主要问题

  1. 依赖项解析:如果单体仓库中的多个包使用不同版本的 Prisma ORM,可能会导致冲突。
  2. Schema 集中化:在多个项目之间管理单个 Prisma Schema 可能很复杂。

单体仓库集成的最佳实践

  • 集中化 Prisma Schema:将 schema.prisma 文件放在共享包中,例如 @myorg/db,以确保一致性。

  • 为生成的客户端使用自定义输出目录:为生成的 Prisma Client 定义一个自定义输出目录,以保持包之间的一致性。

  • 在根目录安装依赖项:为防止版本冲突,请在单体仓库的根目录安装 Prisma ORM。如果个别包需要直接访问 Prisma(例如,用于本地客户端生成),也要在这些包中安装它。您可以使用 Turborepo 等单体仓库工具,遵循其最佳实践,或者采用类似的策略来保持应用程序中依赖项的同步。

  • 使用 NPM 脚本进行生成:

      {
    "scripts": {
    "prisma:generate": "prisma generate --schema=./packages/db/schema.prisma"
    }
    }

此方法可使您的 Prisma Schema 和生成的客户端在单体仓库的所有项目中保持同步。


在 Next.js 中动态使用 Prisma Client

处理动态场景

动态用例,例如处理特定于租户的数据库,在使用 Prisma ORM 和 Next.js 时需要额外考虑。

问题

每个租户可能都有自己的数据库,这需要在运行时创建单独的 Prisma Client。由于 Next.js 的混合渲染模型,这可能很复杂。

解决方案

使用工厂函数根据租户特定配置动态创建 Prisma Client

// lib/prismaDynamic.ts
import { PrismaClient } from "../prisma/generated/client";

type TenantConfig = {
databaseUrl: string;
};

export function createPrismaClient(config: TenantConfig): PrismaClient {
return new PrismaClient({
datasources: {
db: {
url: config.databaseUrl,
},
},
});
}

确保您管理动态创建的 Prisma Client 的生命周期,以避免资源耗尽。

© . This site is unofficial and not affiliated with Prisma Data, Inc.