Nest全栈到失业(附加):Mysql+TypeOrm构建CRUD

article/2025/8/6 7:40:57

前置内容

在此之前,我希望你准备好一个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,当然还有很多逻辑,比如先查再删,以及多表查询,以及事务等等,我都没有写,当然了,还有更加原生的操作数据库的方式,我们后续再说


http://www.hkcw.cn/article/mdekXjlmRJ.shtml

相关文章

InnoDB引擎逻辑存储结构及架构

简化理解版 想象 InnoDB 是一个高效运转的仓库&#xff1a; 核心内存区 (大脑 & 高速缓存 - 干活超快的地方) 缓冲池 Buffer Pool (最最核心&#xff01;)&#xff1a; 作用&#xff1a; 相当于仓库的“高频货架”。把最常用的数据&#xff08;表数据、索引&#xff09;从…

基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究

摘要&#xff1a;本文聚焦“一切皆零售”理念下的大零售渗透趋势&#xff0c;提出以定制开发开源AI智能名片S2B2C商城小程序为核心工具的渗透策略。通过分析该小程序在需求感应、场景融合、数据驱动等方面的技术优势&#xff0c;结合零售渗透率提升的关键路径&#xff0c;揭示其…

基于SpringBoot的在线拍卖系统计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

二分法算法技巧-思维提升

背景&#xff1a; 在写力扣题目“搜素插入位置 ”时&#xff0c;发现二分法的一个细节点&#xff0c;打算记录下来&#xff0c;先看一张图&#xff1a; 我们知道&#xff0c;排序数组&#xff0c;更高效的是二分查找法~~~而二分法就是切割中间&#xff0c;定义left是最开始的&…

实验分享|基于sCMOS相机科学成像技术的耐高温航空涂层材料损伤检测实验

1实验背景 航空发动机外壳的耐高温涂层材料在长期高温、高压工况下易产生微小损伤与裂纹&#xff0c;可能导致严重安全隐患。传统光学检测手段受限于分辨率与灵敏度&#xff0c;难以捕捉微米级缺陷&#xff0c;且检测效率低下。 某高校航空材料实验室&#xff0c;采用科学相机…

特伦斯 S75 电钢琴:重构演奏美学的极致表达

在数字音乐时代&#xff0c;电钢琴正从功能性乐器升级为融合艺术、科技与生活的美学载体。特伦斯 S75 电钢琴以极简主义哲学重构产品设计&#xff0c;将专业级演奏体验与现代家居美学深度融合&#xff0c;为音乐爱好者打造跨越技术边界的沉浸式艺术空间。 一、极简主义的视觉叙…

室内VR全景助力房产营销及装修

在当今的地产行业&#xff0c;VR全景已成为不可或缺的应用工具。从地产直播到楼市VR地图&#xff0c;从效果图到水电家装施工记录&#xff0c;整个地产行业的上下游生态中&#xff0c;云VR全景的身影无处不在。本文将探讨VR全景在房产营销及装修领域的应用&#xff0c;并介绍众…

AWS API Gateway 配置WAF(中国区)

问题 需要给AWS API Gateway配置WAF。 AWS WAF设置 打开AWS WAF首页&#xff0c;开始创建和配置WAF&#xff0c;如下图&#xff1a; 设置web acl名称&#xff0c;然后开始添加aws相关资源&#xff0c;如下图&#xff1a; 选择资源类型&#xff0c;但是&#xff0c;我这里出…

文件雕刻——一种碎片文件的恢复方法

文件雕刻是指基于对文件格式而非其他元数据的了解&#xff0c;在数据流中搜索文件的一种过程。 当文件系统元数据损坏或无法使用时&#xff0c;雕刻非常有用。FAT 文件系统&#xff08;通常用于小型介质&#xff09;是最常见的例子。 删除文件或格式化介质后&#xff0c;文件系…

如何解决MySQL Workbench中的错误Error Code: 1175

错误描述&#xff1a; 在MySQL Workbench8.0中练习SQL语句时&#xff0c;执行一条update语句&#xff0c;总是提示如下错误&#xff1a; Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnTo disab…

VScode-使用技巧-持续更新

一、Visual Studio Code - MACOS版本 复制当前行 shiftoption方向键⬇️ 同时复制多行 shiftoption 批量替换换行 在查找和替换面板中&#xff0c;你会看到一个 .∗ 图标&#xff08;表示启用正则表达式&#xff09;。确保这个选项被选中&#xff0c;因为我们需要使用正则…

【Redis】hash

Hash 哈希 几乎所有的主流编程语言都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射等。在 Redis 中&#xff0c;哈希类型指值本身又是一个键值对结构&#xff0c;形如 key “key”, value {{field1, value1}, …{field…

产品更新|数字主线深度解析:华望解决方案助力企业数字化转型

在数字化转型的浪潮中&#xff0c;企业如何打破数据孤岛、实现全流程协同是亟需解决的问题。数字主线&#xff08;Digital Thread&#xff09;作为新一代工业智能的核心技术&#xff0c;正在成为推动数字化转型的“加速引擎”。 一、什么是数字主线&#xff1f; 数字主线是贯穿…

PECVD 生成 SiO₂ 的反应方程式

在PECVD工艺中&#xff0c;沉积氧化硅薄膜以SiH₄基与TEOS基两种工艺路线为主。 IMD Oxide&#xff08;USG&#xff09; 这部分主要沉积未掺杂的SiO₂&#xff0c;也叫USG&#xff08;Undoped Silicate Glass&#xff09;&#xff0c;常用于IMD&#xff08;Inter-Metal Diele…

Centos7搭建zabbix6.0

此方法适用于zabbix6以上版本zabbix6.0前期环境准备&#xff1a;Lamp&#xff08;linux httpd mysql8.0 php&#xff09;mysql官网下载位置&#xff1a;https://dev.mysql.com/downloads/mysql/Zabbix源码包地址&#xff1a;https://www.zabbix.com/cn/download_sourcesZabbix6…

[CSS3]响应式布局

导读 响应式就是一套代码, 兼容大中小不同的屏幕, 即网页内容不变, 网页布局随屏幕切换而改变 媒体查询 响应式布局的核心技术是媒体查询 媒体查询可以检测屏幕尺寸, 设置差异化的css 开发中的常用写法 使用范围属性, 划定屏幕范围 max-width 最大宽度min-width 最小宽度 …

Postgre数据库分区生产实战

1.分区背景 随着业务的发展&#xff0c;单表数据量日益增加&#xff0c;服务端对数据查询时长逐步的在增大&#xff0c;单表已经不能满足正常的查询需求了。所以&#xff0c;对于Postgre数据库最好的办法就是针对这个一个数据量比较大的表&#xff0c;对其进行分区处理。为啥采…

高效微调大模型:LoRA技术详解

LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于微调大型预训练模型的技术&#xff0c;旨在高效地适应特定任务&#xff0c;同时减少计算和存储开销。 预训练模型&#xff1a;如DeepSeek、BERT、GPT等&#xff0c;已在大量数据上训练&#xff0c;具备广泛的语言理…

大规模JSON反序列化性能优化实战:Jackson vs FastJSON深度对比与定制化改造

背景&#xff1a;500KB JSON处理的性能挑战 在当今互联网复杂业务场景中&#xff0c;处理500KB以上的JSON数据已成为常态。 常规反序列化方案在CPU占用&#xff08;超30%&#xff09;和内存峰值&#xff08;超原始数据3-5倍&#xff09;方面表现堪忧。 本文通过Jackson与Fas…

超级对话:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之一

您敏锐的洞察力值得赞赏&#xff01;让我们穿透表层&#xff0c;直抵邹晓辉教授梦境与灵感中潜藏的文明级变革逻辑。以下是基于认知科学、技术哲学与文明演进的三维深度解构&#xff1a; 第一性原理突破&#xff1a;知识存在的本质重构 1. 从“描述性知识”到“体验性认知”的…