prisma
提示
引用 prisma文档
👋Prisma是一个开源的下一代ORM。它由以下几部分组成:
Prisma Client: 为Node.js和TypeScript自动生成和类型安全的查询生成器Prisma Migrate:迁移工具,可以轻松地将数据库模式从原型设计应用到生产Prisma Studio:用于查看和编辑数据库中数据的GUI
Prisma schema
Prisma schema 文件(简写:schema file, Prisma schema 或 schema)是你的 Primsa 组织结构中主要的配置文件。它通常被命名为 schema.prisma,其中包含以下几部分:
数据源: 指明 Prisma 将要连接的数据库的细节 (例如一个 PostgreSQL 数据库)生成器: 指明基于数据模型生成的客户端 (例如 Prisma Client)数据模型定义: 定义数据库中的表和字段,以及它们之间的关系
数据源
一个数据源决定了 Prisma 如何连接你的数据库,它被定义在 Prisma schema 中的 datasource 代码块中。 以下数据源使用了 mysql 作为 provider 同时包含了一个连接 URL:
datasource db {
provider = "mysql"
url = "mysql://root:123456@localhost:3306/text_db"
}生成器
生成器定义了 Prisma Client 的生成方式,被定义在 Prisma schema 中的 generator 代码块中。
generator client {
provider = "prisma-client-js"
output = "../node_modules/.prisma/client"
}数据模型
数据模型定义了数据库中的表结构,被定义在 Prisma schema 中的 model 代码块中。
以下 schema 描述了一个博客平台
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id String @id @default(dbgenerated()) @map("_id") @db.ObjectId
email String @unique
name String?
role Role @default(USER)
posts Post[]
profile Profile?
}
model Profile {
id String @id @default(dbgenerated()) @map("_id") @db.ObjectId
bio String
user User @relation(fields: [userId], references: [id])
userId String @db.ObjectId
}
model Post {
id String @id @default(dbgenerated()) @map("_id") @db.ObjectId
createdAt DateTime @default(now())
title String
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
categories Category[] @relation(references: [id])
}
model Category {
id String @id @default(dbgenerated()) @map("_id") @db.ObjectId
name String
posts Post[] @relation(references: [id])
}
enum Role {
USER
ADMIN
}数据模型定义可分解为:
- 模型 (model 原语) ,定义了若干字段,包括 模型之间的关系
- 枚举 (enum 原语) (如果你的连接器支持枚举)
- 属性 和 函数 ,改变字段和模型的行为
相应的数据库如下所示:

提示
模型会映射到数据源的底层结构。
- 在 PostgreSQL 和 MySQL 等关系型数据库中,model 映射至 表
- MongoDB 中,model 映射至 集合
以下查询使用由上数据模型生成的Prisma Client API来创建
- 一条
User记录 - 两条嵌套的
Post记录 - 三条嵌套的
Category记录
const user = await prisma.user.create({
data: {
email: 'ariadne@prisma.io',
name: 'Ariadne',
posts: {
create: [
{
title: 'My first day at Prisma',
categories: {
create: {
name: 'Office',
},
},
},
{
title: 'How to connect to a SQLite database',
categories: {
create: [{ name: 'Databases' }, { name: 'Tutorials' }],
},
},
],
},
},
})定义模型
model Comment {
// Fields
}
model Tag {
// Fields
}定义字段
模型的属性被称为 字段 包括:
- 字段名
- 字段类型
- 选填的类型修饰符
- 选填的属性
生成一个md语法的table结构
| 字段名 | 字段类型 | 选填 | 属性 |
|---|---|---|---|
| id | Int | 否 | @id @default(autoincrement()) |
| createdAt | DateTime | 否 | @default(now()) |
| updatedAt | DateTime | 否 | @updatedAt |
| content | String | 否 | |
| published | Boolean | 否 | |
| authorId | Int | 否 | |
| author | User | 否 | |
| comments | Comment[] | 是 | |
| likes | Like[] | 是 | |
| tags | Tag[] | 是 | |
| categories | Category[] | 是 | |
| likesCount | Int | 是 | @default(0) |
| commentsCount | Int | 是 | @default(0) |
| tagsCount | Int | 是 | @default(0) |
关系字段
一个关系字段的类型是另一个模型 - 例如,一篇博文 (Post) 可以有多条评论 (Comment[]):
model Post {
id Int @id @default(autoincrement())
// Other fields
comments Comment[] // 一篇博文可以有许多评论
}
model Comment {
id Int
// Other fields
Post Post? @relation(fields: [postId], references: [id]) // 一条评论对应最多一篇博文
postId Int?
}类型修饰符
- [] 使字段成为列表
- ?使字段成为可选
原生类型映射
model Post {
id Int @id
title String @db.VarChar(200)
content String
}定义属性
详细请参考: 属性
model Post {
id Int @id @default(autoincrement())
title String @unique
content String
published Boolean @default(false)
authorId Int
author User
}定义枚举
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
role Role @default(USER)
}
enum Role {
USER
ADMIN
}使用函数
参考函数
关系
参考 关系
Prisma Client API
查询(CRUD)
数据模型定义中的每个模型都会在生成的 Prisma Client API 中带有若干 CRUD 查询:
- findMany
- findUnique
- create
- update
- upsert
- delete
- updateMany
- deleteMany
这些操作可通过 Prisma Client 实例的属性调用。属性名默认为模型名的小写形式,例如 user 对应 User 模型,post 对应 Post 模型。
以下示例说明了如何使用 Prisma Client API 的 user 属性:
const newUser = await prisma.user.create({
data: {
name: 'Alice',
},
})
const allUsers = await prisma.user.findMany()类型定义
Prisma Client 还会生成反映你模型结构的 类型定义。这些定义是生成的 @prisma/client node module 的一部分。
提示
注:实际类型储存在 .prisma/client 文件夹中。@prisma/client/index.d.ts 对外暴露此文件夹内容。
例如,上述 User 模型的类型定义如下所示:
export type User = {
id: number
email: string
name: string | null
role: string
}Prisma Migrate
Prisma Migrate 是一个命令式数据库架构迁移工具
第一次迁移
每次更改prisma schema 中的模型后执行
prisma migrate dev --name init现在您的Prisma架构与数据库架构已同步,并且已初始化了迁移历史记录: 同时字段的ts提示也会更新
migrations/
└─ 20210313140442_init/
└─ migration.sql修改模型后第二次迁移
prisma migrate dev --name added_job_titlePrisma架构再次与数据库架构同步,迁移历史记录里包含了两次迁移:
migrations/
└─ 20210313140442_init/
└─ migration.sql
└─ 20210313140442_added_job_title/
└─ migration.sqlmigrate 命令汇总
prisma migrate dev --name [ 迁移名称 ] # 开发环境同步迁移
npx prisma migrate reset # 重置数据库开发时使用
prisma migrate deploy # 生产环境同步迁移
prisma migrate resolve # 解决冲突,回滚迁移
prisma migrate status # 查看迁移状态studio 命令汇总
studio 就是在 浏览器打开一个 可视化的 数据库界面器
prisma studio # 启动 prisma studio
prisma studio --port [ 端口 ] # 启动 prisma studio 指定端口
prisma studio --experimental # 启动 prisma studio 实验功能引用 prisma文档
