前面我们使用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/
如果遇到安装包损坏,可以按照下面的提示进行操作
Nest连接数据库
客户端下载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
但是Navicat 会报错,可能是以下原因,我们上面mysql服务已经启动
,目前就剩数据库密码
没有配置,可以设置一下自己的mysql的密码
2003 - Can‘t connect to MySQL server on ‘127.0.0.1‘ (61 “Connection refused“)
设置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的感觉了
Nest连接mysql流程说明,以及 @nestjs/typeorm typeorm mysql 之间的关系说明
Nest 连接数据库,对数据库进行操作,需要安装的依赖
npm install --save @nestjs/typeorm typeorm mysql
安装的依赖这都什么跟什么,下面我们就来捋一下他们的关系,以及整体流程
+--------------------+
| 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 |
+-----------------------------+
-
NestJS App:
- 整个应用程序的核心。
- 使用各种模块、服务和控制器来构建业务逻辑。
- 通过依赖注入来组织和管理组件。
-
@nestjs/typeorm:
- NestJS 框架中的一个模块,提供与 TypeORM 的集成。
- 通过配置文件
连接数据库
。 - 提供依赖注入支持,使用
TypeOrmModule
来导入和使用 TypeORM 的功能。
-
TypeORM:
- 一个 ORM 库,用于
管理数据库连接
、定义实体
、执行查询和数据库迁移
。 负责将 TypeScript/JavaScript 对象映射到数据库表
。- 提供方便的 API 进行数据库操作,如 CRUD 操作和复杂查询。
- 一个 ORM 库,用于
-
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语句,会生成对应的数据内容
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
这样就直接把数据的数据查出来了
总结
-
没玩过数据库的同学,可能在数据库这块会停滞很久解决问题,具体可以看看这个教程
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 装饰器,奠定坚实基础!!!!!!》