跳到主要内容

什么是 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 更新数据库
  • 通过客户端调用接口

通过数据库生成

  • 手动调整数据库
  • 重新通过数据库生成数据模型
  • (可选)重新配置
  • 重新生成客户端
  • 通过客户端调用接口