跳至主要内容

如何在 pnpm Workspaces Monorepo 中使用 Prisma ORM

10 分钟

Prisma 是一个功能强大的 ORM,用于管理您的数据库,当与 pnpm Workspaces 结合使用时,您可以维护一个精简且模块化的 Monorepo 架构。在本指南中,我们将介绍如何在 pnpm Workspaces Monorepo 中将 Prisma 设置为独立的包,从而实现可维护的类型共享和跨应用程序的高效数据库管理。

您将学到:

  • 如何使用 pnpm Workspaces 初始化 Monorepo。
  • 将 Prisma 集成作为独立包的步骤。
  • 如何在包之间生成和共享 Prisma Client。
  • 将 Prisma 包集成到工作区中的应用程序。

1. 准备您的项目并配置 pnpm 工作区

在集成 Prisma 之前,您需要设置项目结构。首先为您的项目创建一个新目录(例如,my-monorepo)并初始化一个 Node.js 项目。

mkdir my-monorepo
cd my-monorepo
pnpm init

接下来,创建一个 pnpm-workspace.yaml 文件来定义您的工作区结构并固定 Prisma 版本。

touch pnpm-workspace.yaml

将以下配置添加到 pnpm-workspace.yaml

pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
catalogs:
prisma:
prisma: latest
注意

catalogs 帮助您在您的存储库中固定特定版本的 Prisma。您可以在 此处 了解更多信息。显式地在 pnpm-workspace.yaml 文件中固定最新版本的 prisma。在撰写本文时,版本为 6.3.1

最后,为您的应用程序和共享包创建目录。

mkdir apps
mkdir -p packages/database

2. 设置共享数据库包

本节介绍如何创建使用 Prisma 的独立数据库包。该包将包含所有数据库模型和生成的 Prisma Client,使其可在您的 Monorepo 中重用。

2.1. 初始化包并安装依赖项

导航到 packages/database 目录并初始化一个新包。

cd packages/database
pnpm init

使用固定的 catalog 将 Prisma 添加为 package.json 中的开发依赖项。

database/package.json
"devDependencies": {
"prisma": "catalog:prisma"
}

然后安装 Prisma。

pnpm install

然后,添加额外的依赖项。

pnpm add typescript tsx @types/node @types/pg -D
pnpm add @prisma/adapter-pg pg
信息

如果你使用的是其他数据库提供程序(MySQL、SQL Server、SQLite),请安装相应的驱动程序适配器包,而不是 @prisma/adapter-pg。有关更多信息,请参阅 数据库驱动程序

为您的 database 包初始化一个 tsconfig.json 文件。

pnpm tsc --init

2.2. 在数据库包中设置 Prisma ORM

通过运行以下命令,在 database 包中使用 Prisma Postgres 实例初始化 Prisma ORM。

pnpm prisma init --db

输入您的项目名称并选择一个数据库区域。

信息

我们将在本指南中使用 Prisma Postgres。如果您不使用 Prisma Postgres 数据库,则不需要添加 --db 标志。

此命令

  • 将您的 CLI 连接到您的帐户。如果您未登录或没有帐户,您的浏览器将打开以引导您创建新帐户或登录现有帐户。
  • 创建一个包含数据库模型 schema.prisma 文件的 prisma 目录。
  • 创建一个 .env 文件,其中包含您的 DATABASE_URL(例如,对于 Prisma Postgres,它应该包含类似 DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI..." 的内容)。

编辑 schema.prisma 文件以在您的数据库中定义一个 User 模型,并指定一个自定义 output 目录来生成 Prisma Client。这确保了生成的类型正确解析。

prisma/schema.prisma
generator client {
provider = "prisma-client"
output = "../generated/client"
}

datasource db {
provider = "postgresql"
}

model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}

现在,在 database 包中创建一个 prisma.config.ts 文件来配置 Prisma。

database/prisma.config.ts
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config';

export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
});
注意

您需要安装 dotenv 包以从 .env 文件加载环境变量。

pnpm add dotenv

接下来,将辅助脚本添加到您的 package.json 中以简化 Prisma 命令。

database/package.json
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"db:generate": "prisma generate",
"db:migrate": "prisma migrate dev",
"db:deploy": "prisma migrate deploy",
"db:studio": "prisma studio"
}
}

使用 Prisma Migrate 迁移您的数据库更改。

pnpm run db:migrate

当 CLI 提示时,为您的迁移输入一个描述性名称。

迁移成功后,创建一个 client.ts 文件来使用驱动程序适配器初始化 Prisma Client。

database/client.ts
import { PrismaClient } from "./generated/client";
import { PrismaPg } from "@prisma/adapter-pg";

const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
});

// Use globalThis for broader environment compatibility
const globalForPrisma = globalThis as typeof globalThis & {
prisma?: PrismaClient;
};

// Named export with global memoization
export const prisma: PrismaClient =
globalForPrisma.prisma ?? new PrismaClient({
adapter,
});

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

然后,创建一个 index.ts 文件以重新导出 Prisma Client 实例和所有生成的类型。

database/index.ts
export { prisma } from "./client";
export * from "./generated/client";

至此,您的共享数据库包已完全配置并可在您的 Monorepo 中使用。

3. 设置和集成您的前端应用程序

现在数据库包已设置好,创建一个前端应用程序(使用 Next.js),它使用共享的 Prisma Client 与您的数据库交互。

3.1. 引导 Next.js 应用程序

导航到 apps 目录。

cd ../../apps

创建一个名为 web 的新 Next.js 应用程序。

pnpm create next-app@latest web --yes
重要

--yes 标志使用默认配置来引导 Next.js 应用程序(在本指南中,它使用不带 src/ 目录的应用程序路由器和 pnpm 作为安装程序)。

此外,该标志可能会自动在 web 文件夹中初始化一个 Git 存储库。如果发生这种情况,请通过运行 rm -r .git 删除 .git 目录。

然后,导航到 web 目录。

cd web/

从数据库包复制 .env 文件,以确保可使用相同的环境变量。

cp ../../packages/database/.env .

打开您的 Next.js 应用程序的 package.json 文件,并将共享的 database 包添加为依赖项。

web/package.json
"dependencies": {
"database": "workspace:*",
// additional dependencies
// ...
}

运行以下命令安装 database 包。

pnpm install

3.2. 在应用程序代码中集成共享的 database

修改您的 Next.js 应用程序代码,以使用数据库包中的 Prisma Client。按如下方式更新 app/page.tsx

app/page.tsx
import { prisma } from "database";

export default async function Home() {
const user = await prisma.user.findFirst({
select: {
name: true
}
})

return (
<div>
{user?.name && <p>Hello from {user.name}</p>}
{!user?.name && <p>No user has been added to the database yet. </p>}
</div>
);
}

此代码演示了导入和使用共享的 Prisma Client 来查询您的 User 模型。

3.3. 添加辅助脚本并运行您的应用程序

将以下脚本添加到您的 Monorepo 的根 package.json 中。它们确保数据库迁移、类型生成和应用程序构建按正确的顺序运行。

"scripts": {
"build": "pnpm --filter database db:deploy && pnpm --filter database db:generate && pnpm --filter web build",
"start": "pnpm --filter web start",
"dev": "pnpm --filter database db:generate && pnpm --filter web dev",
"studio": "pnpm --filter database db:studio"
}

3.4. 运行您的应用程序

然后返回 Monorepo 的根目录。

cd ../../

执行以下命令启动您的开发服务器。

pnpm run dev

在浏览器中打开 https://:3000 查看您的应用程序。

3.5. (可选)使用 Prisma Studio 向数据库添加数据

您的数据库中应该还没有数据。您可以在 CLI 中执行 pnpm run studio,在 https://:5555 启动一个 Prisma Studio,以便与您的数据库交互并向其中添加数据。

下一步

现在您已经创建了一个有效地使用 Prisma ORM 的 Monorepo,并已将共享数据库包集成到 Next.js 应用程序中。

如需进一步探索和增强您的设置,请考虑阅读 如何在 Turborepo 中使用 Prisma ORM 指南。


与 Prisma 保持联系

通过以下方式与我们保持联系,继续你的 Prisma 之旅: 我们的活跃社区。保持信息灵通,参与其中,并与其他开发人员协作。

我们真诚地感谢你的参与,并期待你成为我们社区的一部分!

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