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下,整体开发流程:
- 开发环境
npx prisma migrate reset
- 生成客户端并创建表
npx prisma migrate dev --name init
会根据 schema 文件生成 sql 并执行:
- 部署使用 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的使用,希望对大家有所帮助!