返回首页

用 Prisma 构建类型安全的数据库层

AD
@admin2026-06-20 · 11 阅读

用 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 },
});

踩过的坑

  1. N+1 查询:用 include 替代循环查询
  2. 连接池耗尽:生产环境调整 connection limit
  3. 大事务超时:批量操作分批处理

Prisma 的学习曲线很平缓,强烈推荐给使用 Node.js + TypeScript 的团队。

0
0 11

0 条评论

登录 后即可发表评论
加载评论中...