Sequelize
经典 ORM;模型关联。
30 分钟
Sequelize
Sequelize 是 Node 生态 历史最久 的 ORM 之一:Model 类、关联(hasMany/belongsTo)、Hook、Migration CLI 一应俱全。维护老项目或读开源代码时,Sequelize 仍高频出现。
学习目标
- 定义 Model 与字段类型
- 配置 hasMany / belongsTo 关联
- 理解 Sequelize 与 Drizzle/Knex 的取舍
Model 定义
import { Sequelize, DataTypes } from "sequelize";
const sequelize = new Sequelize(process.env.DATABASE_URL);
const Track = sequelize.define("Track", {
slug: { type: DataTypes.STRING(64), allowNull: false, unique: true },
title: { type: DataTypes.STRING(255), allowNull: false },
}, { tableName: "tracks", underscored: true });
await sequelize.sync(); // 开发用;生产请用 migration
生产环境 应用 sequelize-cli 迁移,而非 sync() 改表。
关联示例
const Lesson = sequelize.define("Lesson", {
slug: DataTypes.STRING,
title: DataTypes.STRING,
});
Track.hasMany(Lesson, { foreignKey: "track_id" });
Lesson.belongsTo(Track);
const track = await Track.findOne({
where: { slug: "nodejs-essentials" },
include: [Lesson],
});
Active Record 风格:findOne、create、update 挂在 Model 上,上手快,复杂查询时 SQL 不透明。
何时仍用 Sequelize
| 情况 | 建议 |
|---|---|
| 遗留代码库已是 Sequelize | 维持 + 逐步抽查询 |
| 团队熟悉 ORM 抽象 | 可继续,注意 N+1 |
| 新 API + TS + Postgres | 优先 Drizzle 或 Nest TypeORM |
数据库设计与索引仍按 postgresql-essentials;Nest 集成见 nest-db。
练习
- 定义 Track / Lesson 两表关联并
include查询 - 用 migration 创建表,禁用
sync()上线路径 - 对比同一查询在 Sequelize 与 Drizzle 下的 SQL 可读性
小结
Sequelize = 经典 ORM,关联与 Hook 齐全,新项目需权衡透明度。 下一课模板引擎:服务端 HTML。
加载本节练习…