Appearance
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 支持三种类型的关系:
- 一对一关系(One-to-one)
- 一对多关系(One-to-many)
- 多对多关系(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 进行数据库操作。