如何使用ORM 工具,Prisma

要使用 ORM 工具 Prisma ,需遵循「环境准备 → 项目初始化 → 数据建模 → 数据库迁移 → 数据查询」的核心流程。以下基于你提供的 Prisma 官方文档(TypeScript + SQLite 场景),提供完整、可落地的使用指南,同时覆盖关键概念和扩展场景

一、核心前提:环境准备

在开始前,确保本地环境满足以下条件:

  • Node.js :需安装 v16.13.0 及以上版本(Prisma 官方推荐,可通过 node -v 验证)。
  • 包管理器:npm、yarn 或 pnpm(本文以 npm 为例)。
  • 数据库:本文以轻量级的 SQLite 为例(无需额外安装数据库服务);若使用 PostgreSQL/MySQL/MongoDB,需提前准备数据库实例和连接信息。

二、Step 1:初始化 TypeScript 项目(若从零开始)

若已有项目可跳过此步,直接进入 Prisma 安装;若从零开始,需先创建并配置 TypeScript 项目:

  1. 创建项目目录并进入

    bash

    bash 复制代码
    mkdir prisma-demo && cd prisma-demo
  2. 初始化 npm 项目

    bash

    csharp 复制代码
    npm init -y  # 生成 package.json
  3. 安装 TypeScript 相关依赖

    bash

    ruby 复制代码
    npm install typescript tsx @types/node --save-dev
    # tsx:用于快速运行 TypeScript 脚本(无需手动编译)
    # @types/node:提供 Node.js 的 TypeScript 类型定义
  4. 初始化 TypeScript 配置

    bash

    csharp 复制代码
    npx tsc --init  # 生成 tsconfig.json(默认配置即可,无需额外修改)

    三、Step 2:安装并初始化 Prisma

Prisma 的核心组件包括 Prisma CLI (命令行工具)和 Prisma Client(类型安全的查询客户端),需先完成初始化:

1. 安装 Prisma CLI(开发依赖)

bash

css 复制代码
npm install prisma --save-dev

2. 初始化 Prisma 项目

通过 prisma init 命令创建 Prisma 核心配置文件,并指定数据库类型(此处为 SQLite):

bash

shell 复制代码
npx prisma init --datasource-provider sqlite --output ./prisma
# 参数说明:
# --datasource-provider sqlite:指定数据库类型为 SQLite(可选值:postgresql、mysql、mongodb 等)
# --output ./prisma:指定 Prisma 配置文件的存放目录(默认就是 ./prisma,可省略)

执行后,项目中会生成两个关键文件 / 目录:

  • prisma/schema.prisma:Prisma 的核心配置文件,用于定义数据库连接、数据模型(Model)、生成规则等。
  • .env:环境变量文件,用于存储数据库连接字符串(默认生成 SQLite 连接,格式为 DATABASE_URL="file:./prisma/dev.db")。

四、Step 3:数据建模(定义 Prisma Model)

Prisma Model 是「数据库表」与「代码类型」的映射,需在 prisma/schema.prisma 中定义。Model 的字段对应表的列,属性(如 @id@unique)对应表的约束。

示例:定义 User 和 Post 模型

替换 prisma/schema.prisma 中的默认内容为以下代码(支持一对多关系):

prisma

kotlin 复制代码
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"  // 生成 Prisma Client 的规则(固定)
}

datasource db {
  provider = "sqlite"  // 数据库类型(与初始化时一致)
  url      = env("DATABASE_URL")  // 读取 .env 中的数据库连接字符串
}

// 用户模型(对应数据库中的 User 表)
model User {
  id    Int     @id @default(autoincrement())  // 自增主键
  email String  @unique  // 唯一约束(邮箱不重复)
  name  String?  // 可选字段(允许为 null)
  posts Post[]   // 一对多关系:一个用户可拥有多个帖子
}

// 帖子模型(对应数据库中的 Post 表)
model Post {
  id        Int     @id @default(autoincrement())  // 自增主键
  title     String  // 必选字段(帖子标题)
  content   String?  // 可选字段(帖子内容)
  published Boolean @default(false)  // 默认值:未发布(false)
  author    User    @relation(fields: [authorId], references: [User.id])  // 多对一关系:关联 User
  authorId  Int     // 外键:关联 User 表的 id 字段
}

Model 核心语法说明

语法 作用 示例
@id 标记为主键 id Int @id
@default(autoincrement()) 自增默认值(仅整数主键支持) id Int @id @default(autoincrement())
@unique 标记为唯一约束(字段值不重复) email String @unique
String? 可选字段(允许为 null,不加 ? 则必选) name String?
@relation(...) 定义关系(多对一 / 一对多 / 多对多) author User @relation(fields: [authorId], references: [id])

五、Step 4:数据库迁移(创建表结构)

Prisma Migrate 是 Prisma 的数据库迁移工具,可将 Prisma Model 映射为实际的数据库表,并生成可追踪的迁移文件(便于团队协作和版本控制)。

执行首次迁移

bash

csharp 复制代码
npx prisma migrate dev --name init
# 参数说明:
# --name init:给迁移命名(便于识别,如 "init" 表示初始化表结构)

执行后会完成三件事:

  1. prisma/migrations 目录下生成迁移文件(如 20240520123456_init/migration.sql),包含创建 UserPost 表的 SQL 语句。
  2. 自动执行迁移文件,在 prisma/dev.db 中创建对应的表(SQLite 数据库文件,无需手动创建)。
  3. 自动生成 Prisma Client(无需额外执行命令)。

六、Step 5:使用 Prisma Client 操作数据库

Prisma Client 是类型安全的查询客户端(由 Prisma 根据 Model 自动生成),支持增删改查(CRUD)和关系查询,且提供 TypeScript 自动补全。

1. 安装 Prisma Client

bash

bash 复制代码
npm install @prisma/client
# 注意:安装后会自动执行 `prisma generate`,生成客户端代码(位于 node_modules/.prisma/client)

2. 核心操作示例:创建脚本并执行

创建 script.ts 文件,编写查询逻辑(以下覆盖常见场景):

示例脚本:CRUD + 关系查询

typescript

php 复制代码
// 1. 导入并初始化 Prisma Client
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()  // 实例化客户端(全局建议单例)

// 2. 定义异步函数(Prisma 查询均为异步操作)
async function main() {
  // --------------------------
  // 场景1:创建一条 User 记录
  // --------------------------
  const newUser = await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io'
    }
  })
  console.log('创建的用户:', newUser)

  // --------------------------
  // 场景2:创建 User 时,同时创建关联的 Post(嵌套创建)
  // --------------------------
  const userWithPosts = await prisma.user.create({
    data: {
      name: 'Bob',
      email: 'bob@prisma.io',
      posts: {  // 嵌套创建关联的 Post(一对多关系)
        create: [
          { title: 'Hello Prisma', published: true },
          { title: 'Prisma 关系查询', content: '这是一篇草稿' }
        ]
      }
    }
  })
  console.log('创建的用户(含帖子):', userWithPosts)

  // --------------------------
  // 场景3:查询所有 User,并包含关联的 Post(关系查询)
  // --------------------------
  const allUsersWithPosts = await prisma.user.findMany({
    include: {
      posts: true  // 关联查询:返回用户的所有帖子
    }
  })
  console.log('所有用户(含帖子):', JSON.stringify(allUsersWithPosts, null, 2))

  // --------------------------
  // 场景4:更新 Post 状态(将未发布改为已发布)
  // --------------------------
  const updatedPost = await prisma.post.update({
    where: { id: 2 },  // 条件:更新 id=2 的帖子
    data: { published: true }  // 更新内容:发布状态改为 true
  })
  console.log('更新后的帖子:', updatedPost)

  // --------------------------
  // 场景5:删除一条 User 记录(级联删除关联的 Post)
  // --------------------------
  const deletedUser = await prisma.user.delete({
    where: { id: 1 },  // 条件:删除 id=1 的用户
    include: { posts: true }  // 同时返回被删除的用户及关联帖子
  })
  console.log('删除的用户:', deletedUser)
}

// 3. 执行函数并处理连接
main()
  .then(async () => {
    await prisma.$disconnect()  // 成功后断开数据库连接
  })
  .catch(async (e) => {
    console.error('查询出错:', e)
    await prisma.$disconnect()  // 出错后也需断开连接
    process.exit(1)  // 退出进程(标记错误状态)
  })

3. 运行脚本

使用 tsx 直接运行 TypeScript 脚本(无需编译为 JavaScript):

bash

复制代码
npx tsx script.ts

执行后,控制台会输出各步骤的结果,同时可通过 Prisma Studio 可视化查看数据。

七、Step 6:可视化查看数据(Prisma Studio)

Prisma 内置 GUI 工具 Prisma Studio,可快速查看和编辑数据库内容,无需手动写 SQL。

启动 Prisma Studio

bash

复制代码
npx prisma studio

启动后,会自动在浏览器打开 http://localhost:5555,界面中可直观看到 UserPost 表的数据,支持增删改查操作(适合开发阶段调试)。

八、扩展场景:切换到其他数据库(如 PostgreSQL)

若需从 SQLite 切换到 PostgreSQL(或 MySQL),只需修改两个配置:

  1. 更新 .env 文件中的数据库连接字符串

    env

    ini 复制代码
    # 原 SQLite 连接(注释或删除)
    # DATABASE_URL="file:./prisma/dev.db"
    # 新 PostgreSQL 连接(需替换为你的数据库地址、用户名、密码、数据库名)
    DATABASE_URL="postgresql://username:password@localhost:5432/mydb?schema=public"
  2. 更新 prisma/schema.prisma 中的数据源

    prisma

    ini 复制代码
    datasource db {
      provider = "postgresql"  // 改为 postgresql(或 mysql/mongodb)
      url      = env("DATABASE_URL")
    }
  3. 重新执行迁移

    bash

    css 复制代码
    npx prisma migrate dev --name switch_to_postgres

之后的查询逻辑(Prisma Client 代码)完全不变 ------Prisma 会自动适配不同数据库的语法,实现「一次建模,多数据库兼容」。

九、关键注意事项

  1. Prisma Client 生成时机 :当修改 schema.prisma(如新增 Model、修改字段)后,需重新生成 Prisma Client,执行 npx prisma generate
  2. 迁移文件的版本控制prisma/migrations 目录需纳入 Git 管理,确保团队成员使用相同的表结构。
  3. 生产环境迁移 :生产环境不可用 prisma migrate dev(会自动创建数据库),需使用 prisma migrate deploy(仅执行迁移,不创建数据库)。
  4. 类型安全:Prisma Client 会为每个 Model 和查询生成 TypeScript 类型,无需手动定义,错误会在编译阶段暴露(而非运行时)。

通过以上步骤,你已掌握 Prisma 的核心使用流程。如需深入,可进一步学习「多对多关系」「事务」「原生 SQL 查询」「Prisma Accelerate(连接池与缓存)」等高级特性,参考 Prisma 官方文档

编辑分享

如何验证Prisma的安装是否成功?

如何使用Prisma进行数据库迁移?

Prisma有哪些高级特性和扩展场景?

相关推荐
布列瑟农的星空6 小时前
重学React——memo能防止Context的额外渲染吗
前端
FuckPatience6 小时前
Vue 与.Net Core WebApi交互时路由初探
前端·javascript·vue.js
小小前端_我自坚强6 小时前
前端踩坑指南 - 避免这些常见陷阱
前端·程序员·代码规范
lichenyang4536 小时前
从零实现JSON与图片文件上传功能
前端
WebGirl6 小时前
动态生成多层表头表格算法
前端·javascript
hywel7 小时前
一开始只是想整理下书签,结果做成了一个 AI 插件 😂
前端
傅里叶7 小时前
SchedulerBinding 的三个Frame回调
前端·flutter
小小前端_我自坚强7 小时前
React Hooks 使用详解
前端·react.js·redux
java水泥工7 小时前
基于Echarts+HTML5可视化数据大屏展示-车辆综合管控平台
前端·echarts·html5·大屏模版