前言
对于全栈or后端人员来说数据操作是必需掌握的技能,本章节主要讲解nestjs
通过TypeORM框架(ORM 对象关系映射)来对MySQL
数据表user
进行查询,添加操作,通过Docker
构建MySQL
环境,方便同学们快速搭建环境
效果
通过Postman
查看nestjs框架
应用创建,查询mysql
数据
快速创建nestjs应用
通过nestjs CLI
脚手架快速创建应用(点击查看如何快速创建应用): mysql-nestjs
nest new mysql-nestjs
创建成功后进入项目启动应用
cd mysql-nestjs
npm run start:dev
接下来开始配置mysql环境
Docker 安装 mysql
1.首先需要下载 Docker
应用程序
下载地址对应系统的安装包
Docker
安装成功后点开该应用,这是可以看到Containers
为空的
- 创建
docker-compose.yml
在项目mysql-nestjs
根目录下创建Docker
容器应用的配置文件:docker-compose.yml
,并定义服务镜像
# docker-compose.yml
# Use root/example as user/password credentials
version: '3.1'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: testdb
ports:
- 3307:3306
# navicat
adminer:
image: adminer
restart: always
ports:
- 8080:8080
这里定义了两个镜像:
mysql
的镜像,username
默认为root
,password为example
,database是:testdb
adminer
管理数据库简单而强大的工具,方便可视化查看数据,通过localhost:8080
访问页面
- 启动
Docker
容器
在项目mysql-nestjs
根目录下运行指令启动Docker 镜像
docker-compose up -d
其中 -d
为后台运行,具体Docker
指令点击查看 ,启动成功后可以看到Docker
应用程序中Containers
容器运行情况:
浏览器访问:localhost:8080
访问adminer
页面,首先需要登录
输入上面配置Mysql image
账号信息,可以看到testdb
数据里无table
- 创建user table
为了后文nestjs
链接mysql
对表进行查询和创建操作,这里先提前创建user
表,包含的字段:id,name(名字),age(年龄)
sql如下:
CREATE TABLE IF NOT EXISTS user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT NOT NULL
);
在 adminer
上的操作步骤:
nestjs链接mysql
这里使用TypeORM框架(ORM 对象关系映射)来建立应用程序与数据库之间的连接,它提供一个高效的方式来进行数据库操作,通过@nestjs/typeorm更好使用TypeORM
- 安装TypeORM依赖
npm install --save @nestjs/typeorm typeorm mysql2
- 创建
User module
本文主要介绍对User table
操作,所以这里使用nest cli
快速创建该模块(cli 指令了解),依次按顺序创建:
nest g mo user
nest g co user --no-spec
nest g s user --no-spec
指令执行后会在src
目录后会多出个user
对应文件,这时候还需要在src/user
目录下创建user实体类user.entity.ts
// src/user/user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
age: number;
}
user.service.ts
文件中创建查询,添加user的方法
// src/user/user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) { }
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
create(user: User): Promise<User> {
return this.usersRepository.save(user);
}
}
user.controller.ts
添加对应api请求接口:
- 查询user:GET
localhost:3000/users
- 创建user:POST
localhost:3000/users
// src/user/user.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) { }
@Get()
findAll(): Promise<User[]> {
return this.userService.findAll();
}
@Post()
create(@Body() user: User): Promise<User> {
return this.userService.create(user);
}
}
user.module.ts
中引入 typeorm 和 user.entity.ts
实体类映射mysql user
// src/user/user.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { User } from './user.entity';
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UserService],
controllers: [UserController],
})
export class UserModule { }
- 配置 mysql connect
在项目src/app.module.ts
(root module)中通过@nestjs/typeorm
来链接mysql
// src/app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3307,
username: 'root',
password: 'example',
database: 'testdb',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
UserModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule { }
操作user表
本文使用Postman
方便快速的来接口请求
- POST请求
localhost:3000/users
创建user
记录,Body 使用Json格式(NestJS 提供了对 JSON 格式的强大支持。通过使用@Body()
装饰器)
接口成功返回添加的 user 记录
2.GET请求 localhost:3000/users
,查看user
列表
最后我们也可以在adminer
中查看到user table
中插入的数据
总结
本文主要是通过TypeORM
让nestjs
应用链接mysql
并对user table
数据进行创建,查询操作,其中为了抹平开发过程中的运行环境差异使用了Docker
安装mysql 生态环境