
这个系列的上一篇文章,实现了 Post 接口和对接口的基础操作。
而真正的服务往往包括数据存储。
本篇将介绍如何建立 NestJs 的数据库连接、并使用数据库联表查询。这样就就是完整的后台服务了。
完整示例可以在 github 找到。
本篇使用 mysql 作为数据库连接。使用 NestJs 内置的数据库连接 typeorm,可在 这里 查阅 typeorm 详细文档
一、开发准备
- 下载并安装 Mysql
创建 school 库
1
create database school;
安装 @nestjs/typeorm typeorm mysql2
1
npm install --save @nestjs/typeorm typeorm mysql2
二、数据库连接
1 | // app.module.ts |
初始化数据库连接。
autoLoadEntities 自动化 load entity 文件, 所有在 Module 中引用的 Entity 文件会被自动加载。自动加载设置为 true 即可。
synchronize 自动化同步表,本地可自动打开,线上数据库不建议打开。
三、定义表结构
1 | import { |
@Entity注解代表是数据库入口文件;@Column是基础列文件,使用type字段定义在数据库实际存储@PrimaryGeneratedColumn代表单调递增的主键@UpdateDateColumn当记录修改时会修改时间@CreateDateColumn当记录新增时会写入时间
四、引用表
1 | // students.module.ts |
imports引用 typeorm 模块, entity 才可以在 service 中使用providersservice 的 constructor 需要引用哪些模块controllers模块的 controller
1 | // students.service.ts |
这样会在 db 中建立 students 新表。
使用 show create table 能看表的详细信息。
1 | use school; |
五、与数据库交互
到这一步,终于可以和数据库进行交互了。基本上和数据库交互的部分都会放在 service 层,因此 新增 和 查询 都放在 service 层。
其中包括了
getStudentName的改造setStudent函数的新增
1 | // students.service.ts |
通过使用 find 和 create 对学生查询和创建。结果也是异步的。
下面对 controller 进行改造,使得函数调用串起来。
1 | // students.controller.ts |
通过对 service 的调用, 再经 controller 调用产生如下结果
1 | // ✅ 命令行访问 |
通过对 service 的 save、find 调用,就能将数据完整存入数据库了。
六、联表查询
我们准备新建课程表class,每个班级可以有多个学生,一个学生隶属一个班级。
这样学生和班级就构成了 n:1 的关系。
为了方便展示,在学生模块下直接新增 class.entity.ts 文件。并通过 @OneToMany 关联 students。
1 | // classes.entity.ts |
同时修改 students.entity.ts, 通过 @ManyToOne 引入 Classes 修改
1 | // students.entity.ts |
注意:classes 表引用 students 是通过新建字段(students\class)进行关联。
引用会最终在数据库变成外键连接。
1 | show create table student; |
再引入表,详细操作可看第四步。
students.module.ts 引入表
1 | // students.module.ts |
students.service.ts 引入表, 并实现 setClass, getClass 方法
1 | import { Classes } from './entities/classes.entity'; |
新增 ClassesDto
1 | // classes.dto.ts |
students.controller.ts 修改
1 | // students.controller.ts |
调用接口,先插入数据再查询数据。
1 | // 再新增一条数据 |
七、简单回顾
再回顾下本章:
- 使用
typeorm和mysql建立连接 - 使用
entity文件创建数据库表 service使用对数据库的简单调用,包括写入和读取- 使用关系查询,将
student和classes连接写入和查询
至此,我们使用 typeorm 和 mysql 连接数据库就完成了。
完整示例可以在 github 找到。
下章我们将主要讲 NestJs 的高级用法,包括 管道、守卫和拦截器。期待你的阅读。

