用 Prisma 构建类型安全的数据库层
用 Prisma 构建类型安全的数据库层
Prisma 是 Node.js 生态中最好的 ORM 之一。分享一下实际项目中的使用心得。
为什么选 Prisma
1. 类型安全
Schema 定义即类型来源:
model User {
id String @id @default(uuid())
username String @unique
email String @unique
posts Post[]
createdAt DateTime @default(now())
}
生成的 TypeScript 类型完全可用,不会出现运行时字段不匹配的问题。
2. 迁移管理
# 修改 Schema 后
npx prisma migrate dev --name add_user_bio
# 自动生成迁移 SQL,部署时
npx prisma migrate deploy
3. 关联查询
const post = await prisma.post.findUnique({
where: { id },
include: {
author: { select: { username: true, avatar: true } },
node: { select: { name: true, slug: true } },
_count: { select: { likes: true, comments: true } },
},
});
// post.author.username ✅ 类型安全
// post._count.likes ✅ 自动生成
最佳实践
1. 使用 select 而非 include(需要时)
// 👍 只查需要的字段
const users = await prisma.user.findMany({
select: { id: true, username: true, avatar: true },
});
// 👎 查全部字段(除非确实需要)
const users = await prisma.user.findMany();
2. 事务处理
const [post, notification] = await prisma.$transaction([
prisma.post.create({ data: postData }),
prisma.notification.create({ data: notifData }),
]);
3. 软删除
// Schema 中添加 deletedAt 字段
model Post {
deletedAt DateTime?
}
// 查询时自动过滤
const posts = await prisma.post.findMany({
where: { deletedAt: null },
});
踩过的坑
- N+1 查询:用
include替代循环查询 - 连接池耗尽:生产环境调整 connection limit
- 大事务超时:批量操作分批处理
Prisma 的学习曲线很平缓,强烈推荐给使用 Node.js + TypeScript 的团队。
0
0 13