前置内容
在此之前,我希望你准备好一个docker环境,以及魔法的网络哦
自己创建一个项目哈,使用nest new XXX
Docker
什么是docker?相信很多人都知道了,说白了,就是一个镜像容器;以mysql为例,你在电脑上使用mysql5.6啥的,他电脑上是5.7啥的,然后数据内容不兼容了,怎么办了?他卸载还是你卸载?
Docker站出来就说,别和我说我这里可以,你不行.我把我的环境打包给你都行,一个虚拟的地方,搭建环境,不需要复杂的安装,只需要pull就好了
我们创建一个mysql的环境吧
点击搜索框,自己pull一下mysql即可
去自己的镜像里,点击运行一个新的容器实例出来
这里我创建有了,所以名字我就用我创建好的book-end了哈,图中为示例
到此就好了,去你的容器里运行就好了,注意,如果跑不起来,就说明你的端口被占用了
Mysql
我们需要使用链接工具去链接一下我们的数据库,如果是轻量使用建议使用navicat即可,工具的连接方式都是一样的,我使用的是jetbrains全家桶的DataGrip
运行容器实例
新建链接
测试是通过了即可
TypeOrm
什么是TypeOrm ,其实怎么说呢?我们数据库里保存的数据啊,是不是可以看一个大大的对象,里边都是键值对的形式呢?
那typeorm就说了,你会前端,又想操作数据库,来,我让你用操作对象的方式操作数据库,你都不用写那么复杂的语句(当然了,也可以写,取决于你的项目难度和链接使用orm的方式)
动态模块方式
什么是动态模块,我没有说,你就这样认为吧,就是我们使用一个模块的时候,我们想要自定义的传一些配置,就是这样的
在项目中,你需要提前安装mysql2 ,typeorm等包
npm i --save @nestjs/typeorm typeorm mysql2 @types/node#数据库工具
这里,因为我们暂时是在默认的app中使用,所以我们就在app.module里写吧(并不是只有app哦,因为app是整个nest的实例,所以全都可以用)
其实这样,我们就可以链接了,省的就是操作了
当然了,你也可以把这些配置来出来,整一个typeorm.config.ts,然后引入也是一样的
这里需要注意哈,因为你拉出来,直接使用他或许不知道你的是什么,所以使用as断言他就是我们的orm的配置选项即可
data-source方式
不过官方却说了,我们不建议使用这种方式了,建议你使用官方的方式,这个图看看就行了,就是和你说有这句话
他官方使用的是,他会直接生成两个文件,和两个文件夹,
一个是我们的data-source文件,用来书写orm链接的配置选项
一个是执行创建好的实例初始化的index.ts文件,这一个也必须有,否则无法第一次初始化链接,也无法写入我们的实体了
一个entity文件夹:用来存放我们的实体,不过我们不会用的,我们会把实体放在每一个对应的模块下的,建议直接删了
一个migration文件夹,用来做数据库迁移的,暂时不说了
npx typeorm init --database mysql2
然后你看data-source文件哈,他报错了,报错的原因其实就是因为缺少了链接数据库的内容?
怎么缺了?你不是把他写在typeOmr.config.ts里了嘛
怎么办?我们直接搬过来就好了啊
简单吧,直接搬过来
你发现,还是错,怎么办?那就删删改改呗,注意我最后的as 断言哦,这是必须的
这就好了,一些基础的链接的配置,写在上边就好了
一些关于整个数据库的配置的,写在下边就好了
然后,我们看看我们的index.ts文件是干啥的
哦,看懂了,其实就是我们的最后的配置导出之后的一个初始化方法,那我们需要嘛?
我们这里没有写user实体,他创建的被我们删了,哈哈哈,怎办呢?
两个方式哈
第一,你创建一个user模块,并写上实体,然后就可以去执行这个语句了,他会使用我们的index文件执行项目,所以这是必须的
第二种方式,你吧他直接搬走,初始化方法和data-source的放一起就好了
我们使用第二种方式吧,index就可以删了,不用了
但是他还是报错,怎么回事,你没有user实体啊,你先把他们注释掉就好了
咦,报错了
这是因为,我们没有把链接的配置改过来,导入要换地方了
在执行npm run start:dev即可
CRUD
前置
这样把,我们先创建一个blog模块吧,这里直接创建一个完整的模块并不生成测试文件的命令
使用REST API方式
创建关于他的增删改查
然后就有了该目录
dto
说白了,就是做数据的规范用的
你看我创建的,说明了,使用创建接口的时候,需要写上name,desc,date信息,我规范了结构了类型
update的dot可以继承自创建的dto
entity
就是实体,就是创建表的结构用的.这里我创建一个id自增主键列以及其他的列
然后我们需要在数据库建立的时候注入实体
再然后,我们会在blog服务中使用到实体,所以需要在其模块中注册
Repository
我们操作数据库里的数据方式有很多,这是最最简单的一种哈
我们先看看,我们的控制器中,他自己生成的增删改查的路由,我做了简单的修改
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { BlogService } from './blog.service';
import { CreateBlogDto } from './dto/create-blog.dto';
import { UpdateBlogDto } from './dto/update-blog.dto';@Controller('blog')
export class BlogController {constructor(private readonly blogService: BlogService) {}// 创建@Post()create(@Body() createBlogDto: CreateBlogDto) {return this.blogService.create(createBlogDto);}// 查询@Get()findAll() {return this.blogService.findAll();}// 更新@Patch(':id')update(@Param('id') id: string, @Body() updateBlogDto: UpdateBlogDto) {return this.blogService.update(+id, updateBlogDto);}// 删除@Delete(':id')remove(@Param('id') id: string) {return this.blogService.remove(+id);}
}
然后我们就去服务里,正式开始操作数据了
我们要先注入我们的实体管理器
// 转注入实体管理器constructor(@InjectRepository(Blog)private blogRepository: Repository<Blog>,) {}
然后,我们不做其他的思考哈,就实现最最简单的增删改查
增
async create(createBlogDto: CreateBlogDto) {// 创建新的数据对象const blog = new Blog();blog.name = createBlogDto.name;blog.description = createBlogDto.description;blog.date = createBlogDto.date;// 保存到数据库await this.blogRepository.save(blog);// 返回的响应return {...blog,};}
测试
删
我不去判定他在不在,我直接删
async remove(id: number) {await this.blogRepository.delete(id);return {status: HttpStatus.OK,};}
查
我不按id,name查,我直接查全部的
因为我把前边的删了, 所以就是空的数组
findAll() {return this.blogRepository.find();}
改
然后,我们添加一个,做修改哈
update(id: number, updateBlogDto: UpdateBlogDto) {return this.blogRepository.update(id, updateBlogDto);}
我们去看看结果,修改成功了
结语
我实现了这是最最最简单的CRUD,当然还有很多逻辑,比如先查再删,以及多表查询,以及事务等等,我都没有写,当然了,还有更加原生的操作数据库的方式,我们后续再说