如何在 pnpm workspaces Monorepo 中使用 Prisma ORM
Prisma 是一个功能强大的 ORM,用于管理数据库,与 pnpm Workspaces 结合使用时,可以维护精简且模块化的 monorepo 架构。在本指南中,我们将逐步介绍如何在 pnpm Workspaces Monorepo 中将其设置为独立包,从而实现跨应用的可维护类型共享和高效数据库管理。
您将学到:
- 如何使用 pnpm Workspaces 初始化 Monorepo。
- 将 Prisma 集成到独立包中的步骤。
- 如何在包之间生成和共享 Prisma Client。
- 将 Prisma 包集成到工作区中的应用。
1. 准备项目并配置 pnpm workspaces
在集成 Prisma 之前,需要设置项目结构。首先为项目创建一个新目录(例如,my-monorepo
)并初始化一个 Node.js 项目
mkdir my-monorepo
cd my-monorepo
pnpm init
接下来,创建一个 pnpm-workspace.yaml
文件来定义工作区结构并锁定 Prisma 版本
touch pnpm-workspace.yaml
将以下配置添加到 pnpm-workspace.yaml
中
packages:
- "apps/*"
- "packages/*"
catalogs:
prisma:
prisma: latest
最后,为应用和共享包创建目录
mkdir apps
mkdir -p packages/database
2. 设置共享数据库包
本节介绍如何创建使用 Prisma 的独立数据库包。该包将包含所有数据库模型和生成的 Prisma Client,使其可在您的 monorepo 中重用。
2.1. 初始化包并安装依赖项
导航到 packages/database
目录并初始化一个新包
cd packages/database
pnpm init
使用锁定的 catalog
将 Prisma 添加到 package.json
中作为开发依赖项
"devDependencies": {
"prisma": "catalog:prisma"
}
然后安装 Prisma
pnpm install
然后,添加其他依赖项
pnpm add typescript tsx @types/node -D
然后安装使用 Prisma Postgres 所需的 Prisma Client 扩展
pnpm add @prisma/extension-accelerate
本指南使用Prisma Postgres。如果您计划使用不同的数据库,可以省略 @prisma/extension-accelerate 包。
为您的 database
包初始化一个 tsconfig.json
文件
pnpm tsc --init
2.2. 在数据库包中设置 Prisma ORM
通过运行以下命令,在 database
包中初始化 Prisma ORM 并连接到 Prisma Postgres 实例
pnpm prisma init --db
输入您的项目名称并选择数据库区域。
在本指南中,我们将使用 Prisma Postgres。如果您未使用 Prisma Postgres 数据库,则无需添加 --db
标志。
此命令
- 将您的 CLI 连接到您的帐户。如果您未登录或没有帐户,浏览器将打开以引导您创建新帐户或登录现有帐户。
- 创建一个
prisma
目录,其中包含一个用于数据库模型的schema.prisma
文件。 - 创建一个
.env
文件,其中包含您的DATABASE_URL
(例如,对于 Prisma Postgres,它应该包含类似于DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI..."
的内容)。
编辑 schema.prisma
文件以在数据库中定义一个 User
模型,并指定一个自定义 output
目录来生成 Prisma Client。这确保了生成的类型能够正确解析。
generator client {
provider = "prisma-client-js"
output = "../generated/client"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
接下来,将辅助脚本添加到 package.json
中以简化 Prisma 命令
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"db:generate": "prisma generate --no-engine",
"db:migrate": "prisma migrate dev",
"db:deploy": "prisma migrate deploy",
"db:studio": "prisma studio"
}
}
如果您未使用 Prisma Postgres 作为数据库,请从 db:generate
脚本中排除 --no-engine
标志。
使用 Prisma Migrate 迁移数据库变更
pnpm run db:migrate
当 CLI 提示时,为迁移输入一个描述性名称。
迁移成功后,创建一个 client.ts
文件,使用 Accelerate 扩展初始化 Prisma Client
import { PrismaClient } from "./generated/client";
import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient().$extends(withAccelerate())
const globalForPrisma = global as unknown as { prisma: typeof prisma }
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
export { prisma };
如果您未使用 Prisma Postgres 作为数据库,请排除 import { withAccelerate }
这一行以及其后的 .$extends(withAccelerate())
这一行。
然后,创建一个 index.ts
文件以重新导出 Prisma Client 实例和所有生成的类型
export { prisma } from "./client";
export * from "./generated/client";
至此,您的共享数据库包已完全配置好,可用于您的 monorepo 中的其他部分。
3. 设置并集成前端应用
数据库包设置完成后,创建一个使用共享 Prisma Client 与数据库交互的前端应用(使用 Next.js)。
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
包作为依赖项
"dependencies": {
"database": "workspace:*",
// additional dependencies
// ...
}
运行以下命令安装 database
包
pnpm install
3.2. 在应用代码中集成共享的 database
包
修改 Next.js 应用代码,以使用数据库包中的 Prisma Client。按如下方式更新 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
在浏览器中打开 http://localhost:3000
查看应用运行情况。
3.5.(可选)使用 Prisma Studio 向数据库添加数据
您的数据库中应该还没有数据。您可以在 CLI 中执行 pnpm run studio
以在 http://localhost:5555
启动一个 Prisma Studio,以便与数据库交互并添加数据。
下一步
现在,您已经创建了一个有效地使用 Prisma ORM 的 monorepo,其中包含集成到 Next.js 应用中的共享数据库包。
要进一步探索并增强您的设置,请考虑阅读如何在 Turborepo 中使用 Prisma ORM 指南。
与 Prisma 保持联系
通过以下方式与 我们活跃的社区联系。保持了解、参与其中并与其他开发者协作
- 在 X 上关注我们 获取公告、直播活动和实用技巧。
- 加入我们的 Discord 提问、与社区交流并通过对话获得积极支持。
- 在 YouTube 上订阅 获取教程、演示和直播。
- 在 GitHub 上互动 点赞仓库、报告问题或贡献代码。