Skip to content
On this page

Prisma 基本概念

Prisma 是一个现代化的数据库工具包,它包含一个数据库抽象层、一个自动生成且类型安全的查询构建器,以及一个数据库迁移系统。本指南将介绍 Prisma 的核心概念。

Prisma 组件

Prisma 由以下几个核心组件组成:

1. Prisma Schema

Prisma Schema 是一个定义文件(schema.prisma),它包含:

  • 数据模型定义(Data models)
  • 数据库连接配置
  • 生成器配置
  • 屏蔽模型(Views)和函数定义
prisma
// schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

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

model Post {
  id       Int    @id @default(autoincrement())
  title    String
  content  String?
  published Boolean @default(false)
  author   User    @relation(fields: [authorId], references: [id])
  authorId Int
}

2. Prisma Client

Prisma Client 是一个自动生成的、类型安全的查询构建器,它允许您从 Node.js 和 TypeScript 应用程序中查询数据库。

typescript
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  // 创建用户
  const user = await prisma.user.create({
    data: {
      email: 'alice@prisma.io',
      name: 'Alice',
    },
  })

  // 查询用户
  const allUsers = await prisma.user.findMany()
  console.log(allUsers)
}

3. Prisma Migrate

Prisma Migrate 是一个声明式数据库迁移系统,允许您安全地演进数据库架构。

bash
# 生成迁移文件
npx prisma migrate dev --name add_user_age_field

# 应用迁移到生产环境
npx prisma migrate deploy

4. Prisma Studio

Prisma Studio 是一个 GUI 工具,允许您以可视化方式查看和编辑数据库中的数据。

bash
npx prisma studio

数据模型(Data Models)

数据模型是 Prisma Schema 中最重要的部分,它们定义了数据库表的结构。

基本字段类型

prisma
model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  email     String   @unique
  name      String?
  isStaff   Boolean  @default(false)
  age       Int?
  salary    Float?
  role      Role     @default(USER)
}

关系字段

Prisma 支持三种类型的关系:

  1. 一对一关系(One-to-one)
  2. 一对多关系(One-to-many)
  3. 多对多关系(Many-to-many)
prisma
// 一对多关系
model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  posts Post[]  // 一个用户可以有多篇文章
}

model Post {
  id       Int    @id @default(autoincrement())
  title    String
  user     User   @relation(fields: [userId], references: [id])
  userId   Int    // 关系标量字段
}

Prisma Client API

查询操作

Prisma Client 提供了丰富的查询 API:

typescript
// 查找单个记录
const user = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true }, // 包含关联数据
})

// 查找多个记录
const users = await prisma.user.findMany({
  where: { 
    email: { contains: 'prisma.io' } 
  },
  orderBy: { 
    createdAt: 'desc' 
  },
  take: 10, // 限制结果数量
})

// 计数
const userCount = await prisma.user.count({
  where: { isStaff: true },
})

写入操作

typescript
// 创建
const user = await prisma.user.create({
  data: {
    email: 'john@example.com',
    name: 'John',
  },
})

// 更新
const updatedUser = await prisma.user.update({
  where: { id: 1 },
  data: { name: 'Updated Name' },
})

// 删除
const deletedUser = await prisma.user.delete({
  where: { id: 1 },
})

类型安全

Prisma 提供完全的类型安全:

  • 数据模型转换为 TypeScript 类型
  • 查询结果具有正确的类型
  • 错误的查询在编译时就会被发现
typescript
// TypeScript 会确保字段名称和类型正确
const user = await prisma.user.findUnique({
  where: { 
    id: 1 
    // email: 'test@example.com' // 如果添加这个,TypeScript 会报错
  },
})

// user 的类型是 User | null,具有正确的属性
console.log(user?.email) // 正确
// console.log(user?.nonexistent) // TypeScript 错误

连接池和性能

Prisma Client 内置了连接池管理:

typescript
const prisma = new PrismaClient({
  log: ['query', 'info', 'warn'], // 启用查询日志
  datasources: {
    db: {
      url: process.env.DATABASE_URL!,
    },
  },
})

事务支持

Prisma 支持数据库事务:

typescript
const [user, post] = await prisma.$transaction([
  prisma.user.create({
    data: { email: 'user@example.com' },
  }),
  prisma.post.create({
    data: { title: 'Hello World', authorId: 1 },
  }),
])

这些基本概念构成了 Prisma 的核心,理解它们有助于更好地使用 Prisma 进行数据库操作。