08
数据库访问:数据往哪儿存
Databases · SQL & NoSQL & ORM
光有接口不存数据,接口就是个空壳。这一章讲 Node 怎么连数据库:关系型数据库(MySQL/PostgreSQL,表格思维)、NoSQL(MongoDB,文档思维)、缓存(Redis),以及帮你少写 SQL 的 ORM 工具。
原生 SQL:先懂 mysql2 的连接池
// npm i mysql2 (注意是 mysql2,不是老的 mysql)
import mysql from "mysql2/promise";
// 连接池:提前开好一批连接,用的时候直接取,用完还回去
const pool = mysql.createPool({
host: "localhost",
user: "root",
password: "你的密码",
database: "blog",
waitForConnections: true,
connectionLimit: 10, // 最多同时开 10 个连接
});
// 关键:用 ? 占位符做参数化查询,防 SQL 注入!
async function getUserById(id) {
const [rows] = await pool.execute(
"SELECT * FROM users WHERE id = ?",
[id] // 用户传进来的值,放数组里,库自动转义
);
return rows[0];
}
安全红线:SQL 注入
千万别写成 `SELECT * FROM users WHERE id = ${userInput}` 这种字符串拼接。坏人传进来 "1; DROP TABLE users;",你的表就没了。永远用 ? 占位符 + 参数数组,让驱动替你转义。这一条能挡掉最经典的攻击。
ORM:用对象代替手写 SQL
手写 SQL 容易写错、类型还不安全。ORM(对象关系映射)让你用操作 JavaScript 对象的方式操作数据库,它在背后帮你生成 SQL。三个主流选手:
| ORM | 特点 |
|---|---|
| Prisma 5+ | 新一代明星。先写一个 Schema 文件描述表结构,它自动生成类型安全的客户端,查询语句直观又智能。新项目首选。 |
| TypeORM | TypeScript 老牌,用装饰器定义实体(@Entity、@Column),和 NestJS 天然搭配。 |
| Sequelize | 最老牌的传统 ORM,JavaScript 项目用得多,TypeScript 支持不如前两个。 |
Prisma 三板斧:Schema → 生成 → 查询
// 第一步:prisma/schema.prisma —— 用这种 DSL 描述表结构
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[] // 一个用户有多篇文章(一对多)
}
model Post {
id Int @id @default(autoincrement())
title String
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
// 第二步:命令行同步到数据库并生成客户端
# npx prisma db push 把 schema 推到数据库
# npx prisma generate 生成类型安全的查询客户端
// 第三步:业务代码里查询,自动补全 + 类型安全
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
// 查所有用户,连他们的文章一起带出来
const users = await prisma.user.findMany({
include: { posts: true }
});
NoSQL:MongoDB 与 Redis
MongoDB → 存文档,像存 JSON
用
mongoose 包,定义 Schema 和 Model,做 CRUD 和聚合。什么时候用:数据结构不固定、经常变,或者像评论、日志这种"一条条 JSON"的场景。它不强制表结构,存起来灵活。
Redis → 内存数据库,极快的缓存
用
ioredis 或 node-redis。数据放内存里,读起来快到飞起。干什么用:缓存热点数据(别每次都查 MySQL)、存登录会话、做接口限流计数器、消息队列、发布订阅。是性能优化的标配,后面查得慢的接口先想想能不能塞 Redis。
| 数据库 | 一句话选型建议 |
|---|---|
| SQLite | 本地小数据库,一个文件就是一个库,零配置。小项目、练手、桌面应用首选,配合 better-sqlite3 很爽。 |
| MySQL | 互联网世界最普及的关系型库,生态成熟,国内公司用得最多。 |
| PostgreSQL | 功能更强的关系型库(JSON、地理、复杂查询),新项目呼声越来越高。 |
| MongoDB | 结构灵活的文档库,前端团队上手快。 |
| Redis | 不管主力库是谁,它都该在场——做缓存和计数器。 |
记
本章小结
① 练手用 SQLite + Prisma,零配置又类型安全,体验最好。
② 写 SQL 永远用占位符防注入;生产用连接池,别每查一次开一个连接。
③ 热点数据往 Redis 塞,是最便宜的性能优化。