NestJS之21-prisma使用

315 阅读2分钟

1. 安装依赖

pnpm install prisma --save-dev

pnpm install @prisma/client

2. 命令

  • init:创建 schema 文件,初始化项目结构。
  • generate:根据 schema 文件生成客户端代码。
  • db:包括数据库与 schema 的同步。
  • migrate:处理数据表结构的迁移。
  • studio:提供图形化界面进行 CRUD 操作。
  • validate:验证 schema 文件的语法。
  • format:格式化 schema 文件。
  • version:显示版本信息。

3. 初始化环境

npx prisma init

会生成prisma.schema文件


generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id       Int      @id @default(autoincrement())
  email    String   @unique
  name     String?
  posts    Post[] // 一对多定义
//user     User? // 一对一 
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

@id 是主键

@default(autoincrement()) 是指定默认值是自增的数字

@unique 是添加唯一约束

@relation 是指定多对一的关联关系,通过 authorId 关联 User 的 id


DATABASE_URL="mysql://root:snowball@localhost:3306/snowball_db"
  • @id 定义主键
  • @default 定义默认值
  • @map 定义字段在数据库中的名字
  • @db.xx 定义对应的具体类型
  • @updatedAt 定义更新时间的列
  • @unique 添加唯一约束
  • @relation 定义外键引用
  • @@map 定义表在数据库中的名字
  • @@index 定义索引
  • @@id 定义联合主键

4. 初始化数据库

先reset下然后dev下,整体开发流程:

  1. 开发环境

npx prisma migrate reset

  1. 生成客户端并创建表

npx prisma migrate dev --name init

会根据 schema 文件生成 sql 并执行:

  1. 部署使用 npx prisma migrate deploy

npx prisma generate 生成客户端sql

5. 拆分prismamodel文件

"prisma": {
  "schema": "prisma/schema"
},
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["prismaSchemaFolder"] // 添加
}

就可以在schema文件下创建新的表

新增一个prisma进行全局使用

6. 添加验证

6.1 方法一:class-validator class-transformer

pnpm install class-validator class-transformer

import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator';

export class CreateUserDto {
  @ApiProperty({ description: '用户名', type: String })
  @IsNotEmpty({ message: '用户名不能为空' })
  @IsString({ message: '用户名必须是字符串' })
  @MaxLength(32, { message: '用户名长度不能超过32个字符' })
  name: string;

  @ApiProperty({ description: '密码', type: String })
  @IsNotEmpty({ message: '密码不能为空' })
  @IsString({ message: '密码必须是字符串' })
  password: string;

  @ApiProperty({ name: '头像' })
  @IsString({ message: '头像必须是字符串' })
  @IsOptional()
  avatar: string;

  @ApiProperty({ name: '手机号码', example: 12345678901 })
  @ValidateStringNumber({ message: "手机号码必须是字符串或者数字" })
  @IsOptional()
  phone: string;
}
create(@Body() createUserDto: CreateUserDto) {
  return this.userService.create(createUserDto);
}
async create(createUserDto: CreateUserDto) {
    const findOne = await this.prisma.user.findFirst({
      where: {
        name: createUserDto.name,
      },
    });
    console.log('打印***findOne', findOne);
    if (findOne)
      return {
        msg: '名称重复',
        data: null,
      };
    try {
      const { id } = await this.prisma.user.create({
        data: createUserDto,
        select: {
          id: true,
        },
      });
      return {
        msg: '创建成功',
        data: id,
      };
    } catch (error) {
      return {
        msg: '创建失败',
        data: error,
      };
    }
  }

总结

本文主要介绍prisma的使用,希望对大家有所帮助!