william.chan's blog

done is better than perfect

nestjs 快速掌握 TypeORM

深入图解 TypeORM 核心架构:DataSource、EntityManager 与 Repository

在 NestJS 开发中,TypeORM 是最常被使用的 ORM(对象关系映射)框架。学习 TypeORM 最初的门槛,往往是理不清它里面那几个长得很像的核心类。 本文将结合开局的架构思想图关系,为你彻底梳理清楚 DataSource、EntityManager、Repository 以及 Entity 之间的运作流转逻辑。 1. 核心架构层级解析 在开始讲解每个对象之前,我们先通...

nestjs mysql transaction 和 savepoint

彻底搞懂 ACID、事务并发控制与局部回滚(Savepoint)

在真实的后端业务开发中,我们常常会遇到诸如“转账”这样的场景:A 账户扣钱,B 账户加钱。如果 A 扣钱成功了,但在执行 B 加钱的那一瞬间服务器断电了,或者抛了一个异常,那这笔钱不就凭空消失了吗? 为了解决这种“多步操作必须同生共死”的问题,我们需要引入关系型数据库的超级重器——事务(Transaction)。而 Savepoint(保存点) 则是事务中非常实用的高级进阶特性。 1. ...

nestjs sql select子查询和exists

突破单表查询瓶颈:深入理解 SQL 子查询与 EXISTS 优化

在复杂的业务场景中,我们常常需要基于一个查询的结果去执行另一个查询,这就是子查询(Subquery)。子查询可以让哪怕最复杂的逻辑论证都能在一条 SQL 语句中完成。而 EXISTS 关键字作为子查询的绝佳伴侣,在处理海量数据的性能优化时更是不可或缺。 本文将结合 SQL 原生语句与 NestJS (TypeORM) 实战,带你彻底搞懂并用好它们。 1. 什么是子查询? 子查询是指嵌套...

nestjs sql join

彻底掌握一对一、多表连接(JOIN)查询与级联操作

在实际的业务开发中,数据往往不会一股脑地全塞在一张表里,为了避免数据冗余和维护一致性,通常会通过拆表把数据分散存放在多张关联表中(即数据库的范式设计)。这就意味着,我们需要在查询时把分散的数据重新拼凑起来。这就离不开强大的 JOIN(连接) 查询,以及配套使用的 级联(Cascade)外键约束。 1. 多表连接查询(JOIN) JOIN 是 SQL 中用于把两张或多张表横向结合起来的操作...

nestjs mysql sql

MySQL 基础查询语法与常用内置函数实战精讲

在 NestJS 的后端开发中,无论是手写 SQL 还是使用 TypeORM、Prisma 等 ORM 框架,扎实的数据库查询基本功都是必不可少的。为了演示查询,我们可以连接到 MySQL 数据库,建立一张 student 表,插入一些基础数据,并用这些数据来练习各种查询语法和函数。 1. 基础查询语法 灵活组合以下各种查询条件,就可以应对日常开发中绝大多数的需求。 where:...

nestjs mysql workbench

MySQL Workbench GUI

MySQL Workbench GUI 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 use `hello_mysql`; -- DQL SELECT * FROM `hello_mysql`....

nestjs pm2最佳实践

生产环境下的单机集群伸缩、进程管理与优雅停机方案

Node.js 默认是单线程运行的。这意味着如果你把编译好的 NestJS 应用丢到服务器上直接 node dist/main.js,它只能利用可怜的一个 CPU 核心;而且如果进程抛出了一个未捕获的异常,整个服务会直接崩溃宕机。 为了解决这些问题,我们需要引入生产级的进程管理器——PM2。 1. 为什么需要 PM2? 崩溃自动重启 (Auto Restart):服务意外挂掉后能...

nestjs Dockerfile 技巧

最佳实践:构建极小、极快、安全的 NestJS 生产级镜像

在上一篇文章中,我们了解了 Docker 的基本概念。对于一个 Node.js/NestJS 开发者来说,真正上手遇到的第一关就是写出一个合格的 Dockerfile。 如果你只是简单粗暴地把代码拉进去跑 npm run start:prod,你可能会得到一个体积超过 1GB、每次构建都要等半天、且用 root 权限裸奔的“毒药”镜像。本文介绍 NestJS 镜像打包的最佳实践。 1. ...

Docker 基本概念

镜像、容器、仓库、数据卷与网络,一文搞懂容器化核心

一句话理解 Docker = 代码的集装箱。 把你的代码、运行环境(Node.js)、配置文件、甚至整套 Linux 底层依赖,全部打包到一个箱子里。不管这个箱子拉到开发机、测试服、还是生产环境的集群部署,它的表现绝对一致,彻底消灭 “It works on my machine”(在我电脑上好好的,怎么上去就挂了)。 三大核心概念 这三个概念构成了 Docker 的生命周期...

NestJS 日志最佳实践

内置 Logger、Pino、Winston、结构化日志与生产落地一条龙

为什么日志很重要 日志是线上排障的第一手线索。日志做不好,生产出了问题只能瞎猜。一份好的日志系统需要: 结构化(JSON):机器可解析,方便 ELK / Loki / CloudWatch 查询 分级(debug / info / warn / error):过滤噪音 有 context(traceId / userId / path / latency):每条日志能串联到...