Prisma
-
声明式 Schema:通过独立的 Prisma schema 文件定义数据模型,自动生成类型安全的客户端
-
类型安全:内置的代码生成机制提供出色的 TypeScript 支持,能在编译阶段捕获错误
-
直观查询:采用链式调用语法,写法简洁且易于维护
-
内置 Prisma Migrate 工具,自动生成并管理迁移文件
prisma概念
generator
-
一个 Prisma 模式可以有一个或多个生成器,由
generator表示 -
生成器决定当你运行
prisma generate命令时创建哪些资源 -
用于生成客户端的配置
-
生成 Prisma Client 的主要目的是提供一个类型安全、自动生成的查询构建器
-
对数据库模型进行更改时,都需要重新运行
prisma generate命令,以确保生成的客户端代码与最新的数据库模型保持一致
const { PrismaClient } = require('./generated/prisma-client-js');
const prisma = new PrismaClient();
async function main() {
const allUsers = await prisma.user.findMany();
console.log(allUsers);
}
datasource
- 数据源确定 Prisma ORM 如何连接你的数据库,由datasource表示
schema
- Prisma Schema 的默认名称是
prisma文件夹中的单个文件schema.prisma - Prisma CLI 将自动检测
prisma文件夹 - 要使用多个 Prisma Schema 文件, 在
prisma目录中添加一个 schema文件夹- 通常都需要多个Schema 文件,全部写在一个
schema.prisma难以维护 - 可按模型来拆分schema
- 通常都需要多个Schema 文件,全部写在一个
设置script命令
- prisma generate
- 根据schema文件生成数据模型
- 会根据
schema.prisma自动生成类型安全的数据库
- prisma db push --skip-generate
- prisma db push 将模式同步到数据库
- --skip-generate:表示db push时不会自动运行generate
- prisma studio
- 启动prisma cli图形界面
"scripts": {
"db:generate": "prisma generate",
"db:push": "prisma db push --skip-generate",
"db:studio": "prisma studio"
},
prisma相关命令
| 命令 | 用途 | 适用场景 |
|---|---|---|
prisma migrate dev | 生成并应用迁移,检测架构漂移,重置开发数据库 | 本地开发、测试环境 |
prisma migrate deploy | 将开发完成的迁移应用到生产数据库 | 生产环境部署 |
prisma migrate status | 查看迁移状态(已应用/未应用) | 生产环境检查、CI/CD |
prisma migrate resolve | 手动标记迁移状态(解决冲突或基线设置) | 修复迁移历史异常 |
prisma migrate diff | 生成两个状态间的SQL差异(用于自定义迁移或基线) | 复杂变更、现有数据库迁移 |
prisma db push | 直接同步Schema到数据库(不生成迁移文件) | 快速原型设计 |
prisma migrate reset | 重置数据库并重新应用所有迁移 | 开发环境清理 |
prisma db pull | 从数据库逆向生成Schema | 现有数据库接入 |
prisma db seed | 用于向数据库填充初始数据(即“种子数据”)的核心工具, 执行用户自定义的脚本来, | 实现数据初始化,适用于开发、测试环境的数据准备或数据库重置后的快速恢复 |
prisma generate | 基于schema.prisma定义,生成客户端代码 |
prisma generate理解
- 每当schema有变化时,比如模型、枚举或者关系变更,就需要重新生成客户端
prisma generate命令根据schema.prisma文件中的模型定义,生成类型安全的数据库操作客户端(Prisma Client) 。生成的客户端代码会包含以下内容:- 类型定义:与数据库表结构对应的TypeScript类型(如
User、Post等)。 - CRUD方法:自动生成的数据库操作方法(如
findMany、create、update等)。 - 查询构建器:链式API支持复杂查询(如关联查询、条件过滤、分页等)。
- 类型定义:与数据库表结构对应的TypeScript类型(如
Prisma语法
| 语法类别 | 示例代码 | 说明 |
|---|---|---|
| 模型定义 | model User {<br> id Int @id @default(autoincrement())<br> name String?<br> posts Post[]<br>} | 定义数据模型,@id 表示主键,@default 设置默认值,String? 表示可选字段,Post[] 表示一对多关联。 |
| 字段修饰符 | model Post {<br> title String @unique<br> content String @map("body")<br>} | @unique 确保唯一性,@map 映射到数据库字段名,@updatedAt 自动记录更新时间。 |
| 多对多关联(隐式) | model Post {<br> categories Category[]<br>}<br>model Category {<br> posts Post[]<br>} | Prisma 自动生成中间表 _CategoryToPost,无需手动定义外键。 |
| CRUD 操作 | const user = await prisma.user.create({<br> { name: "Alice", email: "alice@prisma.io " }<br>}); | 创建记录:create 方法插入新数据,返回包含生成字段(如 id)的对象。 |
| 条件查询 | const users = await prisma.user.findMany({<br> where: { role: "ADMIN" },<br> orderBy: { createdAt: "desc" }<br>}); | findMany 支持 where(条件过滤)、orderBy(排序)、select(字段筛选)等参数。 |
| 关联查询 | const userWithPosts = await prisma.user.findUnique({<br> where: { id: 1 },<br> include: { posts: true }<br>}); | include 加载关联数据,支持嵌套查询(如 posts: { include: { categories: true } })。 |
| 更新操作 | const updatedUser = await prisma.user.update({<br> where: { id: 1 },<br> { name: "Alice Updated" }<br>}); | update 需指定 where 条件和 data 更新内容,支持原子操作(如 increment)。 |
| 删除操作 | await prisma.user.delete({<br> where: { id: 1 }<br>}); | delete 根据条件删除记录,支持级联删除(需在模型关联中配置 onDelete)。 |
| 原生 SQL 查询 | const result = await prisma.$queryRaw SELECT* FROM User WHERE email = ${email}; | $queryRaw 直接执行 SQL 语句,适用于复杂查询或性能优化场景。 |
prisma多环境配置
- 自定义环境文件配置,如
.env.local,.env.development、.env.production - prisma默认读取
.env环境配置
一般线上数据库url,通过ci/cd注入环境变量,没必要去读取.env.production
如cloudflare workers,vercel都可以设置环境变量
连接数据库
- Prisma ORM 需要一个连接 URL 才能连接到数据库
- sqlite连接数据库中,连接 URL 始终以
file:前缀开头
- sqlite连接数据库中,连接 URL 始终以
datasource db {
// 指定sqlite数据库
provider = "sqlite"
// 连接数据库 "file:./dev.db"
url = env("DATABASE_URL")
}
定义schema
在vscode安装prisma插件,有代码高亮以及提示
- 在
schema.prisma中定义模型
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
拆分schema
- 启动多文件prisma, 设置
prismaSchemaFolder
schema.prisma
generator client {
....
previewFeatures = ["prismaSchemaFolder"]
}
指定schema位置
- 在
package.json文件中指定的位置- 在src/prisma/schema目录下,指定多个schema文件
"prisma": {
"schema": "src/prisma/schema"
},
Prisma搭配sqlite
- provider:指定sqlite数据库
- url:连接sqlite数据库
schema.prisma
datasource db {
// 指定sqlite数据库
provider = "sqlite"
// 连接数据库
url = env("DATABASE_URL")
}