NextJS 系列 之 Prisma

Date
Created
Mar 26, 2025 10:04 AM
Descrption
Tags
前端工程化
记录
notion image
如果你觉得drizzle有些简单,那你也可以尝试一下Prisma:

1. 安装 Prisma 及相关依赖:

Prisma 需要安装 @prisma/clientprisma,如果数据库是 PostgreSQL、MySQL 或 SQLite,还需安装相应的驱动:
# 安装 Prisma CLI npm install prisma --save-dev # 安装 Prisma Client npm install @prisma/client # 如果使用 PostgreSQL npm install pg

2. 初始化 Prisma:

执行以下命令,生成 prisma/schema.prisma 文件:
npx prisma init
它会创建 .envprisma/schema.prisma 文件,.env 中的 DATABASE_URL 用于存放数据库连接信息,例如:
DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"

3. 配置 prisma/schema.prisma:

prisma/schema.prisma 文件中定义数据库模型。例如,创建一个 User 表:
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // 可选:mysql / sqlite / sqlserver url = env("DATABASE_URL") } model User { id Int @id @default(autoincrement()) name String email String @unique posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id]) }

4. 生成 Prisma Client:

每次修改 schema.prisma 后,需要执行以下命令以生成 Prisma Client:
npx prisma generate
如果是首次运行数据库迁移:
npx prisma migrate dev --name init

5. 在 Next.js API 路由中使用 Prisma

lib/prisma.ts 文件中创建 Prisma 客户端实例:
// lib/prisma.ts import { PrismaClient } from '@prisma/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;
这样可以避免在开发环境下 Hot Reload 造成 Prisma 实例重复创建。

6. 在 API 路由中使用 Prisma:

创建 pages/api/users.ts 处理用户相关 API:
import { prisma } from '@/lib/prisma'; import type { NextApiRequest, NextApiResponse } from 'next'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method === 'GET') { const users = await prisma.user.findMany(); return res.status(200).json(users); } if (req.method === 'POST') { const { name, email } = req.body; try { const newUser = await prisma.user.create({ data: { name, email }, }); return res.status(201).json(newUser); } catch (error) { return res.status(400).json({ error: 'User creation failed' }); } } res.setHeader('Allow', ['GET', 'POST']); res.status(405).end(`Method ${req.method} Not Allowed`); }

7. 部署时的注意事项:

VercelRailway 部署时,需要:
  1. 正确配置 .env,在 Vercel 中设置 DATABASE_URL
  1. 在构建时运行 prisma generatemigrate deploy
npx prisma generate npx prisma migrate deploy

以及你可能会用到Prisma提供商的DB收费也比较合理: