《Nest系列 - 4. 听说人人都会CRUD,可是我还不会怎么办???-《 4.1-数据库连接和实体》》

前面我们使用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 装饰器,奠定坚实基础!!!!!!》

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值