什么是 Prisma
开源下一代 ORM,由 3 部分组成
- Prisma Client: 自动生成类型安全的查询器
- Prisma Migrate: 迁移系统
- Prisma Studio: GUI 数据库编辑工具
可以在 nodejs 后端中使用,可以用来创建 REST API, GraphQL API, gRPC API 或者其他涉及数据的应用。
Prisma 如何工作
Prisma 规范
用来定义应用模型,也用来连接数据库,和作为类型生成器。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
注意:规范功能非常强大,可以定义 Prisma 级别的关联字段,而不在数据库中创建外链。
在规范中,可以定义下面内容
- 数据源:定义数据库连接,可以使用环境变量
- 生成器:用来生成 Prisma client
- 数据模型:定义应用模型
Prisma 数据模型
模型有两个作用
- 代表数据库
- 提供查询基础接口
有两个办法自动生成数据模型
- 手动编写数据模型,通过 Prisma Migrate 生成对应数据库
- 根据数据库自动生成数据模型
定义好模型后,可以生成 Prisma 客户端。客户端提供 CRUD 接口和其他查询接口, 如果使用 Typescript,还能生成安全的类型定义。
通过 Prisma 客户端访问数据
安装
npm install @prisma/client
生成
prisma generate
查询
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
// Run inside `async` function
const allUsers = await prisma.user.findMany();
// Run inside `async` function
const allUsers = await prisma.user.findMany({
include: { posts: true },
});
// Run inside `async` function
const filteredPosts = await prisma.post.findMany({
where: {
OR: [
{ title: { contains: "prisma" } },
{ content: { contains: "prisma" } },
],
},
});
创建
// Run inside `async` function
const user = await prisma.user.create({
data: {
name: "Alice",
email: "alice@prisma.io",
posts: {
create: { title: "Join us for Prisma Day 2020" },
},
},
});
更新
// Run inside `async` function
const post = await prisma.post.update({
where: { id: 42 },
data: { published: true },
});
典型工作流
两种不同的规范生成方式对应两种工作流
Prisma Migrate
- 手动编写数据模型
- 执行 prisma migrate dev 更新数据库
- 通过客户端调用接口
通过数据库生成
- 手动调整数据库
- 重新通过数据库生成数据模型
- (可选)重新配置
- 重新生成客户端
- 通过客户端调用接口