侧边栏壁纸
博主头像
顾小诺 博主等级

行动起来,活在当下

  • 累计撰写 30 篇文章
  • 累计创建 14 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

prisma学习指南-1

顾小诺
2025-08-09 / 0 评论 / 0 点赞 / 16 阅读 / 0 字

一、Prisma 简介

Prisma 是一个现代化的数据库工具链,它简化了数据库访问并提高了开发者的生产力。以下是 Prisma 的核心特点:

主要组件

  1. Prisma Client:自动生成的类型安全数据库客户端,支持多种编程语言

  2. Prisma Migrate:数据库迁移工具,支持版本控制和协作开发

  3. Prisma Studio:直观的GUI界面,用于查看和编辑数据库数据

核心优势

  • 类型安全:自动生成的TypeScript/JavaScript类型与数据库模式保持同步

  • 直观的数据建模:使用声明式的Prisma Schema语言定义数据模型

  • 多数据库支持:兼容PostgreSQL、MySQL、SQLite、SQL Server和MongoDB

  • 开发者友好:减少样板代码,提供直观的API进行复杂查询

典型工作流程

  1. schema.prisma文件中定义数据模型

  2. 使用Prisma Migrate创建和同步数据库结构

  3. 通过自动生成的Prisma Client在应用中执行数据库操作

Prisma特别适合需要强类型、高效数据库访问的现代应用开发,是传统ORM(如TypeORM)的强力替代方案。

二、安装

1. vscode 插件安装

为 .prisma 文件添加语法高亮、格式化、自动补全、跳转到定义和 linting。

2. 项目安装prisma

# 安装类库
npm install prisma --save-dev

# 数据库初始化, 初始化后项目根目录出现 prisma 文件夹
npx install init --datasource-provider sqlite

# 生成测试数据库
npx prisma migrate dev

3. 修改配置

generator client {
  provider = "prisma-client-js"
  output   = "../generated/prisma"
}

  • 修改 output 指向项目根目录

  • 修改DATABASE_URL, 默认生成db文件位于prisma目录

三、常用CLI指令

Prisma 常用 CLI 指令大全

Prisma CLI 是与 Prisma 交互的主要工具,以下是常用的命令及其用途:

1. 初始化相关命令

# 在新项目中初始化 Prisma
npx prisma init

# 指定使用特定数据库初始化
npx prisma init --datasource-provider postgresql
# 可选值: postgresql, mysql, sqlite, sqlserver, mongodb, cockroachdb

2. 数据库迁移命令

# 创建新的迁移文件
npx prisma migrate dev --name init

# 应用所有未执行的迁移
npx prisma migrate deploy

# 重置数据库并重新应用所有迁移
npx prisma migrate reset

# 生成迁移但不应用(用于检查)
npx prisma migrate dev --create-only

# 在生产环境运行迁移
npx prisma migrate deploy
  • npx prisma migrate dev --name init 命令的作用是:

    • 生成新的迁移文件(migration files)

    • 应用该迁移到本地开发数据库

    • 更新 Prisma 客户端(prisma client)

    • 这个命令主要用于开发环境,帮助你在本地数据库更新结构,并生成对应的迁移历史。

  • npx prisma migrate deploy 命令的作用是:

    • 仅在生产环境或非交互环境中执行

    • 根据已经存在的迁移文件,直接应用所有尚未应用的迁移到数据库

    • 不带交互,也不生成新的迁移文件

总结:如果你是在开发环境,刚执行了npx prisma migrate dev --name init,不需要再额外执行 migrate deploy。如果你是在生产环境或者CI/CD流程,通常不会执行migrate dev,而是会用构建好的迁移文件配合 npx prisma migrate deploy 来应用迁移。

  • 开发阶段只执行 npx prisma migrate dev --name init 就够了。

  • 部署到生产或测试环境时,执行 npx prisma migrate deploy

3. 客户端生成命令

# 生成 Prisma Client
npx prisma generate

# 生成并查看客户端类型
npx prisma generate --watch

4. 数据库操作命令

# 启动 Prisma Studio (可视化数据库管理)
npx prisma studio

# 执行数据库种子脚本
npx prisma db seed

# 推送 schema 到数据库(不创建迁移)
npx prisma db push

# 检查 schema 与数据库的差异
npx prisma db pull

5. 开发与调试命令

# 格式化 Prisma schema 文件
npx prisma format

# 验证 schema 文件
npx prisma validate

# 查看 Prisma 版本信息
npx prisma --version

# 调试模式运行(显示详细日志)
npx prisma --debug <command>

6. 特有命令

# 生成迁移的 SQL 脚本(不执行)
npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script

# 从现有数据库导入 schema
npx prisma db pull

# 生成 ER 图
npx prisma generate --data-proxy

7. 常用组合命令

# 开发工作流典型组合
npx prisma migrate dev --name add_user_model && npx prisma generate

# 重置数据库并重新种子数据
npx prisma migrate reset && npx prisma db seed

四、Prisma Model 基本配置指南

Prisma 的 model 是数据模型的核心部分,以下是一些常见的基本配置和用法:

1. 基本 Model 定义

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  age       Int?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

2. 字段类型和修饰符

  • 基本类型:Int, String, Boolean, DateTime, Float, Decimal, Json, Bytes

  • 修饰符:

    • ? - 可选字段

    • [] - 列表/数组

    • @unique - 唯一约束

    • @default - 默认值

3. 关系配置

一对一关系

model User {
  id      Int     @id @default(autoincrement())
  profile Profile?
}

model Profile {
  id     Int  @id @default(autoincrement())
  user   User @relation(fields: [userId], references: [id])
  userId Int  @unique // 关系标量字段
}

一对多关系

model User {
  id      Int     @id @default(autoincrement())
  posts   Post[]
}

model Post {
  id       Int  @id @default(autoincrement())
  author   User @relation(fields: [authorId], references: [id])
  authorId Int
}

多对多关系

model Post {
  id       Int     @id @default(autoincrement())
  tags     Tag[]
}

model Tag {
  id    Int    @id @default(autoincrement())
  posts Post[]
}

4. 索引配置

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  
  @@index([email, name]) // 复合索引
  @@unique([name, age])  // 复合唯一约束
}

5. 枚举类型

enum Role {
  USER
  ADMIN
  MODERATOR
}

model User {
  id   Int   @id @default(autoincrement())
  role Role  @default(USER)
}

6. 映射配置

model User {
  id   Int    @id @default(autoincrement())
  name String @map("user_name") // 映射到不同的列名
  
  @@map("users") // 映射到不同的表名
}

7. 高级默认值

model User {
  id        Int      @id @default(autoincrement())
  uuid      String   @default(uuid())
  timestamp DateTime @default(now())
  sequence  Int      @default(autoincrement())
  active    Boolean  @default(true)
}

8. 原生类型属性

model User {
  id        Int      @id @default(autoincrement())
  name      String   @db.VarChar(255)
  age       Int      @db.SmallInt
  balance   Float    @db.Decimal(10, 2)
  createdAt DateTime @default(now()) @db.Timestamp(6)
}

这些配置可以根据实际项目需求进行组合和调整,Prisma 提供了丰富的选项来满足不同的数据建模需求。

五、 创建单例prisma客户端

1. tsconfig.json 修改

"paths": {
  "@/*": ["./src/*"],
  "$/*": ["./*"]
}

增加$ 指向

2. 创建prismaClient单例

import { PrismaClient } from "$/generated/prisma"

const prismaClientSingleton = () => {
    return new PrismaClient();
}

declare const globalThis: {
    prismaGlobal: ReturnType<typeof prismaClientSingleton>;
} & typeof global;


const db = globalThis.prismaGlobal ?? prismaClientSingleton();

export default db;

if(process.env.NODE_ENV !== "production") globalThis.prismaGlobal = db;

0

评论区