Prisma 是一个 TypeScript 语言支持良好的 ORM 框架,具备良好的数据模型、自动迁移、类型安全和自动完成功能。
安装配置
安装依赖
https://www.prisma.io/docs/getting-started/quickstart
prisma 是 cli 工具,@prisma/client 是 api 使用的包。
npm i -D prisma
npm i -S @prisma/client
VSCode 需要安装对应的插件。
初始化项目
使用脚本初始化,它会创建 prisma 目录,里面有一个 schema.prisma 文件。
npx prisma init --datasource-provider mysql
数据源配置
指定使用的数据库类型为 mysql
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
在生成的 .env 文件中配置数据库连接信息
DATABASE_URL="mysql://账号:密码@地址:3306/数据库名"
可以通过在数据库连接 URL 中显式设置 connection_limit 参数来指定连接数
DATABASE_URL="mysql://账号:密码@地址:3306/数据库名?connection_limit=5"
data model 数据建模
Prisma模式提供了一种直观的数据建模方法。将以下模型添加到 prisma/schema.prisma 文件。
模型可用于表示基础数据库中的表、作为生成的Prisma客户端API的基础等。
定义字段
模型定义语法,包括字段名称、字段类型、修饰符、属性等。
https://www.prisma.io/docs/orm/prisma-schema/data-model/models
字段类型在,支持 String、Boolean、Int、BigInt、Float、Decimal、DateTime、Json等。
https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#model-field-scalar-types
修饰符:
?使用 ? 类型修饰可选类型[]表示数组
属性,包含 @id(单字段主键)、@@id(复合字段主键)、@default、@unique、@@unique、@@index、@relation等。
https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#attributes
定义关联关系
https://www.prisma.io/docs/concepts/components/prisma-schema/relations
- 一对一
- 一对多
- 多对多,有显式和隐式两种,显示可自行指定关联表结构,查询的数据会存在两层嵌套。
隐式多对多可减少嵌套,但关联表需要使用 prisma 内部的规则。另外还有个缺点是不用额外扩充字段了。
Collection 和 Diary 隐式关联,根据字典序:
- 默认表名:
_CollectionToDiary,可通过@relation("MyRelation")自定义,定义后表名为_MyRelation - A 代表 Collection
- B 代表 Diary
自动创建关联关系,可先定义关系:
model Diary {
user User[]
}
然后 schema 文件会报错,通过编辑器选择格式化可自动补全信息。
默认会生成外键,可在 datasource db 中设置关系模式 relationMode 为 prisma,这模拟了Prisma 客户端中的关系,而不是创建外键索引。
prisma 关系模式不使用外键,需要如在关联的表增加 @@index 索引,提升查询效果。
数据库迁移
数据库迁移入门: https://www.prisma.io/docs/orm/prisma-migrate/getting-started
修改 schema.prisma 的模型,执行 migrate 命令,生成迁移文件:
npx prisma migrate dev --name new-field
协同开发时,拉取代码后,执行更新迁移历史记录到数据库:
npx prisma migrate dev
迁移部署命令:
npx prisma migrate deploy
其他迁移相关参考链接:
- 为数据库设定基线: https://www.prisma.io/docs/orm/prisma-migrate/workflows/baselining
- 种子功能,用于创建初始数据等:https://www.prisma.io/docs/orm/prisma-migrate/workflows/seeding
Prisma Client
https://www.prisma.io/docs/orm/reference/prisma-client-reference
创建客户端对象
创建 prisma 客户端,并导出即可使用,也可以传入配置参数。
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
框架集成
Nest.js 集成:
- https://www.prisma.io/nestjs
- 手动引入: https://nest.nodejs.cn/recipes/prisma
- 也可以通过 nestjs-prisma 库来引入,更方便: https://nestjs-prisma.dev/
Next.js 集成:
- https://www.prisma.io/nextjs
- https://www.prisma.io/docs/orm/more/help-and-troubleshooting/nextjs-help
- 开发环境避免 Next.js 热重载导致创建多个实例,解决方案是实例化单个实例 PrismaClient 并将其保存在 global 对象上
生成 Prisma 客户端代码
执行 prisma migrate dev 时,会同步数据库,也会生成 client 代码。
如果不使用迁移系统,只把 Prisma 当做一个 ORM 客户端,也可以单独更新 Prisma 客户端代码:
npx prisma generate
常用增删改查操作文档
操作使用在文档中写得比较清晰,按说明使用即可。
单表操作 https://www.prisma.io/docs/concepts/components/prisma-client/crud
联表操作 https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries
联表操作是在增删改查操作基础上的,需结合单表操作文档使用。
