Sequelize ORM 入门指南
Sequelize 是 Node.js 老牌 ORM:支持 PostgreSQL/MySQL/SQLite/MSSQL,模型即 JS 类。本文走完模型定义、增删改查与关联全流程。
Sequelize 核心三步:new Sequelize() 建立连接、Model.init() 或 sequelize.define() 定义模型、模型方法(create/findAll/update/destroy)完成 CRUD。Promise 化的 API 与 async/await 天然契合。
初始化
npm install sequelize sqlite3
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: './app.db',
logging: false, // 开发期可设为 console.log 看生成的 SQL
});
定义模型
const User = sequelize.define('User', {
name: { type: DataTypes.STRING, allowNull: false },
email: { type: DataTypes.STRING, unique: true, validate: { isEmail: true } },
age: { type: DataTypes.INTEGER },
}, {
tableName: 'users',
timestamps: true, // createdAt/updatedAt 自动管理
});
await sequelize.sync(); // 建表(生产用迁移,见 FAQ)
字段级校验(isEmail、min/max、自定义函数)内建——数据在进库前多一道关。
增删改查
// 创建
const user = await User.create({ name: '张三', email: 'zhang@example.com', age: 28 });
// 查询
const all = await User.findAll({ where: { age: { [Op.gte]: 18 } }, order: [['age', 'DESC']], limit: 10 });
const one = await User.findByPk(1);
const found = await User.findOne({ where: { email: 'zhang@example.com' } });
// 更新
await user.update({ age: 29 });
// 或批量
await User.update({ age: 30 }, { where: { name: '张三' } });
// 删除
await user.destroy();
操作符查询需 const { Op } = require('sequelize')——Op.gte/Op.like/Op.in 等。
关联
User.hasMany(Post);
Post.belongsTo(User);
// 关联查询
const posts = await Post.findAll({ include: User });
// 连实例子级联创建
const user = await User.create({ name: '李四', Posts: [{ title: '...' }] }, { include: Post });
用实际查询验证数据访问方案
Sequelize ORM 入门指南的选择最终要落到查询次数、SQL 耗时与连接占用。应用接入观测云 APM 时,先核对 SDK 是否支持实际使用的数据库驱动,不能因为使用了某个 ORM 就假设全部查询自动可见。未覆盖的查询可手动插桩;PostgreSQL 等服务端数据库另配实例采集。SQL 和绑定参数上报前须脱敏,再按相同接口比较 N+1 查询与慢查询的变化。
接入文档:Node.js APM 接入 · PostgreSQL 采集 · 日志采集。
常见问题(FAQ)
Q:Sequelize 和 Prisma/MikroORM 怎么选?
Sequelize 是 JS 时代的经典(类型支持靠 sequelize-typescript 补强);TS 新项目优先 Prisma/MikroORM。Sequelize 的存量项目庞大,继续维护没有问题。
Q:sequelize.sync() 能用于生产吗?
不能——sync 直接改表结构(force: true 还会删表)。生产用 Sequelize 迁移系统(umzug 或 sequelize-cli 的 migrations)。
Q:事务怎么写?
await sequelize.transaction(async (t) => {
await User.create(data, { transaction: t });
await Log.create(entry, { transaction: t });
});
每个操作显式传 transaction——漏传就出了事务边界,代码评审重点。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。