跳到主要内容

Prisma

  • 声明式 Schema:通过独立的 Prisma schema 文件定义数据模型,自动生成类型安全的客户端

  • 类型安全:内置的代码生成机制提供出色的 TypeScript 支持,能在编译阶段捕获错误

  • 直观查询:采用链式调用语法,写法简洁且易于维护

  • 内置 Prisma Migrate 工具,自动生成并管理迁移文件

prisma概念​

generator​

  • 一个 Prisma 模式可以有一个或多个生成器,由 generator 表示

  • 生成器决定当你运行 prisma generate 命令时创建哪些资源

  • 用于生成客户端的配置

  • 生成 Prisma Client 的主要目的是提供一个类型安全、自动生成的查询构建器

  • 对数据库模型进行更改时,都需要重新运行 prisma generate 命令,以确保生成的客户端代码与最新的数据库模型保持一致

js
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

设置script命令​

  • prisma generate
    • 根据schema文件生成数据模型
    • 会根据schema.prisma自动生成类型安全的数据库
  • prisma db push --skip-generate
    • prisma db push 将模式同步到数据库
    • --skip-generate:表示db push时不会自动运行generate
  • prisma studio
    • 启动prisma cli图形界面
json
"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) 。生成的客户端代码会包含以下内容:
    1. 类型定义:与数据库表结构对应的TypeScript类型(如 User、Post 等)。
    2. CRUD方法:自动生成的数据库操作方法(如 findMany、create、update 等)。
    3. 查询构建器:链式API支持复杂查询(如关联查询、条件过滤、分页等)。

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: 前缀开头
js
datasource db {
// 指定sqlite数据库
provider = "sqlite"
// 连接数据库 "file:./dev.db"
url = env("DATABASE_URL")
}

定义schema​

在vscode安装prisma插件,有代码高亮以及提示

  • 在 schema.prisma 中定义模型
prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}

拆分schema​

  • 启动多文件prisma, 设置prismaSchemaFolder

schema.prisma

js
generator client {
....
previewFeatures = ["prismaSchemaFolder"]
}

指定schema位置​

  • 在 package.json 文件中指定的位置
    • 在src/prisma/schema目录下,指定多个schema文件
json
"prisma": {
"schema": "src/prisma/schema"
},

Prisma搭配sqlite​

  • provider:指定sqlite数据库
  • url:连接sqlite数据库

schema.prisma

js
datasource db {
// 指定sqlite数据库
provider = "sqlite"
// 连接数据库
url = env("DATABASE_URL")
}