Nest系列 - 4. 连接Mysql数据库以及typeOrm介绍

前面我们使用nest g res xxx 自动生成CRUD的代码,不仅简单,而且只能在本地玩。今天我们就来看nest 如何连接数据库,数据库有很多种,我们今天来看连接最常用mysql 数据库,并且使用typeOrm 进行数据库操作

mysql 安装

方式一 官网安装

https://www.mysql.com/

或者直接看满哥教程。从官网安装

https://www.bilibili.com/read/cv18753383/?spm_id_from=333.999.0.0

方式二 私货渠道

https://xclient.info/search/s/mysql/

image.png

如果遇到安装包损坏,可以按照下面的提示进行操作

image.png

Nest连接数据库

image.png

客户端下载mysql: 参考

https://www.cnblogs.com/liyihua/p/12753163.html

然后执行: brew install mysql

客户端连接mysql: mysql -u root -p

-u root: 代表使用root 用户来连接

-p: 表示使用密码连接

mac 如果没有密码,可以直接回车就可以了

h或者使用这个登录一下,相当于设置密码了

mysql -u root -h 自己ip -p '123456'

命令行启动mysql服务: mysql.server start

tips: 关闭服务 mysql.server stop 重启服务 mysql.server restart

image.png

image.png
但是Navicat 会报错,可能是以下原因,我们上面mysql服务已经启动,目前就剩数据库密码没有配置,可以设置一下自己的mysql的密码

2003 - Can‘t connect to MySQL server on ‘127.0.0.1‘ (61 “Connection refused“)
image.png

设置mysql连接密码

参考: https://www.php.cn/faq/829296.html

SET PASSWORD FOR 'root'@'localhost'=PASSWORD('新密码');

ORM框架(typeOrm)

什么是ORM框架 ?
ORM(Object-Relational Mapping)框架是一种工具,用于在编程语言的对象模型与关系数据库的表结构之间进行转换和映射。ORM框架的主要目的是简化开发人员与数据库的交互,使他们能够面向对象的方式操作数据库,而不需要直接编写大量的SQL语句

比如: 根据id 查询user 表的数据

sql:

SELECT * FROM users WHERE id = 1;

orm:

async findOneById(id: number): Promise<User> { 
return await this.usersRepository.findOne(id); 
}

是不是有点写js的感觉了

image.png

Nest连接mysql流程说明,以及 @nestjs/typeorm typeorm mysql 之间的关系说明

Nest 连接数据库,对数据库进行操作,需要安装的依赖

npm install --save @nestjs/typeorm typeorm mysql

image.png

安装的依赖这都什么跟什么,下面我们就来捋一下他们的关系,以及整体流程

                        +--------------------+
                        |     NestJS App     |
                        +--------------------+
                          |                |
             +------------+                +-------------+
             |                                               |
+-------------------------+                 +-----------------------------+
| @nestjs/typeorm         |                 |     MySQL Database          |
|                         |                 |                             |
| - TypeORM Integration   |                 | - Stores data in tables     |
| - Provides repositories |                 | - Executes SQL queries      |
|   for entities          |                 | - Handles transactions      |
+-------------------------+                 +-----------------------------+
            |
+-----------------------------+
|          TypeORM            |
|                             |
| - ORM Library               |
| - Manages entity mappings   |
| - Provides query builder    |
| - Supports database migrations |
+-----------------------------+

  1. NestJS App:

    • 整个应用程序的核心。
    • 使用各种模块、服务和控制器来构建业务逻辑。
    • 通过依赖注入来组织和管理组件。
  2. @nestjs/typeorm:

    • NestJS 框架中的一个模块,提供与 TypeORM 的集成。
    • 通过配置文件连接数据库
    • 提供依赖注入支持,使用 TypeOrmModule 来导入和使用 TypeORM 的功能。
  3. TypeORM:

    • 一个 ORM 库,用于管理数据库连接定义实体执行查询和数据库迁移
    • 负责将 TypeScript/JavaScript 对象映射到数据库表
    • 提供方便的 API 进行数据库操作,如 CRUD 操作和复杂查询。
  4. MySQL Database:

    • 实际存储数据的地方。
    • TypeORM 进行连接和操作
    • 处理 SQL 查询、数据存储和事务管理。

工作流程

  • NestJS App 通过 @nestjs/typeorm 模块配置和使用 TypeORM
  • TypeORM 通过 mysql 驱动连接到 MySQL Database
  • NestJS 的服务使用 TypeORM 提供的 Repository API 来进行数据库操作。
  • MySQL Database 存储数据并处理所有的 SQL 查询和事务。

code 演示

连接数据库

// 导入 TypeOrmModule
import { TypeOrmModule } from '@nestjs/typeorm';
// 定义数据库的连接
TypeOrmModule.forRoot({
      type: "mysql", //数据库类型
      username: "root", //账号
      password: "123456", //密码
      host: "127.0.0.1", //host
      port: 3306, //
      database: "user", //数据库 库名
      entities: [__dirname + '/**/*.entity{.ts,.js}'], //实体文件
      synchronize:true, //synchronize字段代表是否自动将实体类同步到数据库
      retryDelay:500, //重试连接数据库间隔
      retryAttempts:10,//重试连接数据库的次数
      autoLoadEntities:true, //如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中
    })

实体类简单介绍

实体类是什么,如果我这样说你就明白了。在mysql 中创建数据字段,设定默认值,


CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `name` varchar(30) DEFAULT NULL COMMENT 'user name',
  `age` int DEFAULT NULL COMMENT 'user age',
  `created_at` datetime DEFAULT NULL COMMENT 'created time',
  `updated_at` datetime DEFAULT NULL COMMENT 'updated time',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='user'

INSERT INTO users(id, name, age, created_at, updated_at)VALUES(1, 'John Doe', 25, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(2, 'Jane Smith', 30, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(3, 'Michael Johnson', 40, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(4, 'Emily Davis', 22, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(5, 'David Wilson', 35, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(6, 'Sarah Anderson', 28, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(7, 'Daniel Thompson', 32, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(8, 'Olivia Martin', 29, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(9, 'Matthew Roberts', 27, '2023-10-26 08:02:44', '2023-10-26 08:02:44');
INSERT INTO users(id, name, age, created_at, updated_at)VALUES(10, 'Isabella Clark', 33, '2023-10-26 08:02:44', '2023-10-26 08:02:44');


执行上面sql语句,会生成对应的数据内容

image.png

orm 实体:是一个映射到数据库表的类。 你可以通过定义一个新类来创建一个实体,并用@Entity()来标记:

import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm';

// 表名
@Entity({ name: 'users' })
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 30, nullable: true, comment: 'user name' })
  name: string;

  @Column({ nullable: true, comment: 'user age' })
  age: number;

  @CreateDateColumn({ name: 'created_at', type: 'datetime', comment: 'created time' })
  createdAt: Date;

  @UpdateDateColumn({ name: 'updated_at', type: 'datetime', comment: 'updated time' })
  updatedAt: Date;
}

怎么操作数据: 使用InjectRepository装饰器并引入Repository即可使用typeorm的操作,
查询数据:find

image.png

这样就直接把数据的数据查出来了

image.png

总结

  • 没玩过数据库的同学,可能在数据库这块会停滞很久解决问题,具体可以看看这个教程
    https://www.bilibili.com/video/BV1AX4y147tA?p=1&vd_source=de85848cf7ccb9ecd55e0dd26c275613

  • 知道什么事orm框架,就是用面向对象的方式操作数据库,而不需要直接编写大量的SQL语句

  • 梳理清楚 nest typeorm mysql 的关系。 其实typeorm 更像是一个中间者,来进行数据库连接,对数据库进行操作(这个时候就需要实体类来和数据库字段进行对应,因为你也不知道数据是什么字段,需要自己维护一个实体类)

  • 理解 ‘@nestjs/typeorm’ 和 typeorm: 使用@InjectRepository(User)装饰器注入了一个User实体的Repository对象,用于与数据库进行交互

Nest 系列 往期文章

1. 《Nest系列 - 1. 🔥运行一个Nest项目以及整体目录学习》

2. 《Nest系列 - 2. 🔥Nest 代码生成器,让你告别base代码书写!!!》

3. 《# Nest系列 - 3. 🔥掌握常见Nest 装饰器,奠定坚实基础!!!!!!》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/739972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

原装GUVCL-T21GH 韩国Genicom紫外线传感器光电二极管原厂代理商

深圳市宏南科技有限公司是韩国GenUV公司的原厂代理商&#xff0c;所售紫外线传感器均来自于原始生产厂商直接供货&#xff0c;非第三方转售。 韩国GENICOM 紫外线传感器 GUVCL-T21GH 特征&#xff1a; 单供电电压工作 电压输出 高灵敏度和良好的日盲性 尺寸小巧紧凑 韩国GENIC…

如何确保每颗螺丝都是合格品质

螺丝&#xff0c;一种用来连接和固定物体的金属件&#xff0c;通常是长有螺纹的金属棒。螺丝有不同种类和尺寸&#xff0c;常见的用途包括组装家具、机械设备和其他结构。连接和固定物体&#xff0c;通过螺丝的螺纹结构&#xff0c;将两个或多个物体牢固地连接在一起。提供调节…

研究上百个小时,高手总结了这份 DALL-E 3 人物连续性公式(上)

上篇 Dall-E 3 讲了常见的 20 个公式&#xff0c;今天单独来讲一下人物连续性公式&#xff0c;这个公式来自 AshutoshShrivastava。 上篇回顾&#xff1a; 效果超好&#xff01;全新 DALL-E 3 必须掌握的 20 种公式使用方法上周末&#xff0c;DALL-E 3 正式加入 ChatGpt&…

playwright vscode 插件源码解析

Playwright vscode插件主要功能 Playwright是微软开发的一款主要用于UI自动化测试的工具&#xff0c;在vscode中上安装playwright vscode插件&#xff0c;可以运行&#xff0c;录制UI自动化测试。 playwright vscode插件主要包括两块功能&#xff0c;功能一是在Test Explorer中…

excel字符串列的文本分列合并

excel表有两列&#xff0c;第一列是“姓名”&#xff0c;第二列是“诊断”&#xff0c;有高血压、糖尿病等。我想出一个统计表&#xff0c;将每个人的诊断分为1-N列&#xff0c;比如张三&#xff0c;第一诊断高血压&#xff0c;第二诊断糖尿病&#xff0c;分列显示。我们可以用…

七人团购新体验:解锁数字时代购物新篇章

在数字化浪潮的推动下&#xff0c;购物体验正迈向新的里程碑。其中&#xff0c;七人团购模式以其独特的魅力和创新性&#xff0c;为消费者带来了前所未有的实惠与便利。现在&#xff0c;让我们一同探索这一新兴购物模式的运作机制与潜在价值&#xff0c;特别是针对一款标价599元…

Excel如果将一个表格拆分为多个表格,文末另赠彩蛋!

前期分享如何用数据透视表将一个表格拆分成多个工作薄Excel一个表格拆分多个表格&#xff0c;你学会了吗&#xff1f; 今天刘小生分享另外一种&#xff0c;如果拆分成多个工作表格文件&#xff01; 如何将一个表格根据部门进行拆分成多个表格&#xff0c;再点对点发送给各部门…

MacBook Pro 忘记root用户密码,重置密码步骤

一、以普通用户名登录系统&#xff0c;并打开terminal终端&#xff0c; 输入&#xff1a;sudo bash sudo bash Password:*****&#xff08;输入当前用户的密码&#xff09; 成功后进入bash-3.2#的命令模式 二、在bash-3.2#命令模式下 输入&#xff1a;sudo passwd root sud…

代码随想录算法训练营第三十三天|452. 用最少数量的箭引爆气球、 435. 无重叠区间、 763.划分字母区间

452. 用最少数量的箭引爆气球 题目链接&#xff1a;452. 用最少数量的箭引爆气球 文档讲解&#xff1a;代码随想录 状态&#xff1a;没想出来 思路&#xff1a;对气球终点位置排序&#xff0c;从第一个气球终点位置射出箭&#xff0c;看这支箭可以尽可能穿过几个气球&#xff0…

一文搞懂Linux多线程【上】

目录 &#x1f6a9;引言 &#x1f6a9;再次理解页表 &#x1f6a9;初识线程 &#x1f6a9;线程和pthread库 &#x1f680;线程创建 &#x1f6a9;线程的资源共享问题 &#x1f6a9;线程的优缺点 &#x1f6a9;引言 今天&#xff0c;我们开始学习Linux中的线程部分。Lin…

中国车牌检测数据集VOC+YOLO格式2001张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2001 标注数量(xml文件个数)&#xff1a;2001 标注数量(txt文件个数)&#xff1a;2001 标注…

了解SD-WAN与传统WAN的区别

近年来&#xff0c;许多企业选择了SD-WAN作为他们的网络解决方案。云基础架构的SD-WAN不仅具备成本效益&#xff0c;而且提供更安全、更可靠的WAN连接&#xff0c;有助于实现持续盈利。客户能够更好地控制他们的网络&#xff0c;个性化定制且无需额外成本。 那么&#xff0c;为…

Golang逃逸分析

在Go语言中&#xff0c;逃逸分析(Escape Analysis)是一种编译器优化技术&#xff0c;用于确定变量是应该分配在堆上还是在栈上。这对程序的性能有显著的影响&#xff0c;因为栈上资源的分配速度和释放速度要比堆上快得多&#xff0c;同时堆上的内存管理也更加简单。 基本概念 …

快速鲁棒的 ICP (Fast and Robust Iterative Closest Point)

迭代最近点&#xff08;Iterative Closet Point&#xff0c;ICP&#xff09;算法及其变体是两个点集之间刚性配准的基本技术&#xff0c;在机器人技术和三维重建等领域有着广泛的应用。ICP的主要缺点是&#xff1a;收敛速度慢&#xff0c;以及对异常值、缺失数据和部分重叠的敏…

应用监控eBPF 版调研

参考&#xff1a; https://www.toutiao.com/article/7327353509735596559/?appnews_articletamp1717488680&use_new_style1&req_id20240604161119838096AAE4AD4F44788E&group_id7327353509735596559&wxshare_count1&tt_fromweixin&utm_sourceweixin&…

CentOS7.6安装RabbitMQ

前言&#xff1a;因为RabbitMQ是ERlang语言编写所以要先安装ERlang再安装RabbitMQ 安装ERlang 借鉴前辈原文地址&#xff1a;https://www.cnblogs.com/fengyumeng/p/11133924.html 第一步&#xff1a;安装依赖 yum -y install gcc glibc-devel make ncurses-devel open…

PDF秒变翻页式电子画册

​在当今数字化时代&#xff0c;将PDF文档转换成翻页式电子画册是一种提升作品展示效果和传播效率的有效方式。以下是将PDF秒变翻页式电子画册的攻略&#xff0c;帮助您轻松掌握数字创作技巧。 首先&#xff0c;选择一个合适的制作工具是关键。目前市场上有多种在线平台和软件可…

HTML5休闲小游戏《猫猫超市》源码,引流、刷广告利器

HTML5休闲小游戏《猫猫超市》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods467910.html

k8s如何使用 HPA 实现自动扩展

使用Horizontal Pod Autoscaler (HPA) 实验目标&#xff1a; 学习如何使用 HPA 实现自动扩展。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 或内存的资源请求。创建一个 HPA&#xff0c;设置扩展策略。生成负载&#xff0c;观察 HPA 如何自动扩展 Pod…

【Oracle安装】Linux安装Oracle内存不够怎么都装不上,卡在46%、60%、36%;内存不足解决办法,疑难杂症

一、问题描述 1.oracle 安装不报错&#xff0c;但就是无法安装成功&#xff0c;卡住 总是中途卡住&#xff0c;不一定卡在哪儿&#xff0c;也许是36%、46%、60%等等 它也不报错&#xff0c;什么都不说&#xff0c;或者过一会儿服务器自己把oracle的安装进程给杀了&#xff08…