如何使用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有哪些高级特性和扩展场景?

相关推荐
2501_938799421 分钟前
CSS Container Queries:基于父容器的响应式设计
前端·css
一枚前端小能手2 分钟前
🔁 JavaScript中的迭代全攻略 - for/while/迭代器/生成器/for await...of详解
前端·javascript
用户11481867894842 分钟前
深入 V8 引擎与浏览器原理:从理论到 Vue 实战的完整指南
前端
spmcor4 分钟前
Vue命名冲突:当data和computed相爱相杀...
前端·面试
拉不动的猪5 分钟前
单点登录中权限同步的解决方案及验证策略
前端·javascript·面试
znhy@1238 分钟前
十三、JS进阶(二)
开发语言·前端·javascript
JarvanMo24 分钟前
Flutter:使用图像作为屏幕背景
前端
Mintopia26 分钟前
💰 金融Web应用中的AIGC风险控制技术与合规适配
前端·javascript·aigc
Mintopia30 分钟前
🚀 Next.js 压力测试与性能调优实战
前端·javascript·全栈
江城开朗的豌豆30 分钟前
TypeScript 类型系统漫游指南:从入门到爱上类型安全
前端·javascript