TypeORM 集成
为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (ORM)。 由于它是用 TypeScript 编写的,因此可以很好地与 Nest 框架集成。
yarn add @nestjs/typeorm typeorm mysql2 -S
安装过程完成后,我们可以将 TypeOrmModule 导入到根 AppModule 中。
app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DemoModule } from './demo/demo.module';
import { UploadModule } from './upload/upload.module';
import { GuardModule } from './guard/guard.module';
import { ConfigModule } from '@nestjs/config';
import env from './env/index';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true, load: [env] }),
TypeOrmModule.forRoot({
type: "mysql", //数据库类型
username: "root", //账号
password: "xxxxxx", //密码
host: "localhost", //host
port: 3306, //
database: "demo", //库名
entities: [__dirname + '/**/*.entity{.ts,.js}'], //实体文件
synchronize:true, //synchronize字段代表是否自动将实体类同步到数据库
retryDelay:500, //重试连接数据库间隔
retryAttempts:10,//重试连接数据库的次数
autoLoadEntities:true, //如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中
}),
DemoModule,
UploadModule,
GuardModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
使用
目录结构
新增
dto/create-guard.dto.ts
import { ApiProperty } from '@nestjs/swagger'
export class CreateGuardDto {
@ApiProperty({
required:true,
description:"用户名"
})
username:string
@ApiProperty({
required:true,
description:"密码"
})
password:string
}
guard.entity.ts
import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
} from 'typeorm';
@Entity()
export class Guard {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
password: string;
@CreateDateColumn({ type: 'timestamp' })
createTime: Date;
@CreateDateColumn({ type: 'timestamp' })
updateTime: Date;
}
guard.controller.ts
import { Controller, Get, Post, Body, Patch, Param, Delete,UseGuards,SetMetadata } from '@nestjs/common';
import { GuardService } from './guard.service';
import { CreateGuardDto } from './dto/create-guard.dto';
import { UpdateGuardDto } from './dto/update-guard.dto';
import { ApiTags,ApiOperation, ApiParam, ApiQuery } from '@nestjs/swagger';
@ApiTags("guard模块")
export class GuardController {
constructor(private readonly guardService:GuardService) {}
@Post("add")
@ApiOperation({summary:"创建用户"})
@ApiParam({name:'username',description:"用户名"})
@ApiParam({name:'password',description:"密码"})
saveUser(@Body() createGuardDto:CreateGuardDto){
return this.guardService.saveUser(createGuardDto)
}
}
guard.service.ts
import { Injectable } from '@nestjs/common';
import { CreateGuardDto } from './dto/create-guard.dto';
import { InjectRepository } from '@nestjs/typeorm'
import { Guard } from './entities/guard.entity'
import { Repository } from 'typeorm'
@Injectable()
export class GuardService {
constructor(@InjectRepository(Guard) private user: Repository<Guard>){}
saveUser(createGuardDto:CreateGuardDto){
const user = new Guard()
user.username = createGuardDto.username
user.password = createGuardDto.password
return this.user.save(user)
}
}
运行
navcat查看 已经创建了该表
Swagger
数据已保存
修改
guard.controller.ts
@Post('update')
@ApiOperation({summary:'更新'})
@ApiParam({name:'id',description:""})
@ApiParam({name:'username',description:""})
@ApiParam({name:'password',description:""})
updateUser(@Body() updateData:UpdateGuardDto){
console.log(updateData)
return this.guardService.updateUser(updateData)
}
guard.service.ts
updateUser(updateData:UpdateGuardDto){
return this.user.update(updateData.id,updateData)
}
删除
guard.controller.ts
@Post('remove')
@ApiOperation({summary:'删除'})
@ApiParam({name:'id',description:"删除的id"})
remove(@Body('id') id){
console.log(id)
return this.guardService.remove(id)
}
guard.service.ts
async remove(id:number){
const removeDTO = await this.user.findBy({
id
})
console.log(removeDTO)
return this.user.remove(removeDTO)
}
查询
guard.controller.ts
@Get('search')
@ApiOperation({ summary: '查询' })
@ApiQuery({ name: 'username', description: '查询name' })
search(@Query('username') username: string,@Query('page') page:number,@Query('size') size:number) {
return this.guardService.search(username,page,size);
}
guard.service.ts
async search(username: string,page:number = 1,size:number = 10) {
const data = await this.user.findAndCount({
where: {
username: Like(`%${username}%`)
},
skip:(page-1)*size,
take:size
})
return {
list:data[0],
total:data[1]
}
}