Sequelize 是一个基于 Node.js 的 ORM 框架,常用于与 MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server 等关系型数据库进行数据交互,它提供丰富的方法和选项参数,让开发者在开发时更加灵活便捷,本文将详细解释其中的附加选项参数,为开发者提供深度学习和指导意义。
1. where
where 选项用于指定查询条件,可以是一个对象,也可以是一个字符串,最终会转化为 SQL 语句的 WHERE 子句,如下所示:
const result = await User.findOne({ where: { id: 1 } }); // SELECT * FROM `users` WHERE `users`.`id` = 1 LIMIT 1;
如果指定多个查询条件,where 选项会在这些条件之间自动添加 AND 连接符:
const result = await User.findOne({ where: { firstName: 'John', lastName: 'Doe' } }); // SELECT * FROM `users` WHERE `users`.`firstName` = 'John' AND `users`.`lastName` = 'Doe' LIMIT 1;
同时,也可以使用 sequelize.Op 枚举来指定复杂的查询条件,如下所示:
const result = await User.findOne({ where: { [sequelize.Op.or]: [{ firstName: 'John' }, { lastName: 'Doe' }] } }); // SELECT * FROM `users` WHERE (`users`.`firstName` = 'John' OR `users`.`lastName` = 'Doe') LIMIT 1;
2. include
include 选项用于指定关联查询,即在查询某个数据表时,同时获取与其关联的其他数据表中的数据,最终会转化成 SQL 语句的 JOIN 子句,如下所示:
const result = await User.findAll({ include: [{ model: Order, where: { status: Order.Status.Active }, required: true }] }); // SELECT `user`.*, `order`.* FROM `users` INNER JOIN `orders` ON `orders`.`userId` = `users`.`id` AND `orders`.`status` = 'active';
在上面的示例中,查询了所有活跃订单的用户,通过 include 选项指定了 User 表与 Order 表的关联关系,并且在其中指定了 Order 表的查询条件和是否必要。
另外,include 选项也可以嵌套使用,例如可以查询某位作者写过的所有书籍和这些书籍的标签,如下所示:
const result = await Author.findAll({ include: [{ model: Book, include: [Tag] }] });
3. attributes
attributes 选项用于指定查询结果中需要返回哪些字段,可以是一个数组,也可以是一个字符串,如下所示:
const result = await User.findAll({ attributes: ['id', 'firstName'] }); // SELECT `id`, `firstName` FROM `users`;
如果需要排除某个字段,可以在字段前加上减号 -
,如下所示:
const result = await User.findAll({ attributes: { exclude: ['createdAt', 'updatedAt'] } }); // SELECT `id`, `firstName`, `lastName` FROM `users`;
另外,还可以使用 sequelize.fn 和 sequelize.col 函数来查询聚合函数和表达式,如下所示:
const result = await User.findAll({ attributes: [ [sequelize.fn('COUNT', sequelize.col('id')), 'count'] ] }); // SELECT COUNT(`id`) AS `count` FROM `users`;
4. limit 和 offset
limit 和 offset 选项用于指定查询结果的数量和偏移量,limit 指定查询结果的最大数量,offset 指定从哪个位置开始取数据,如下所示:
const result = await User.findAll({ limit: 10, offset: 20 }); // SELECT * FROM `users` LIMIT 10 OFFSET 20;
5. order
order 选项用于指定查询结果的排序方式,可以是一个数组,也可以是一个字符串,如下所示:
const result = await User.findAll({ order: ['firstName', 'lastName DESC'] }); // SELECT * FROM `users` ORDER BY `firstName` ASC, `lastName` DESC;
6. group 和 having
group 和 having 选项用于指定分组和聚合查询,可以是一个字符串,也可以是一个数组,例如查询每个用户的总消费金额:
const result = await Order.findAll({ attributes: ['userId', [sequelize.fn('SUM', sequelize.col('total')), 'total']], group: ['userId'], having: sequelize.where(sequelize.fn('SUM', sequelize.col('total')), '>', 100) }); // SELECT `userId`, SUM(`total`) AS `total` FROM `orders` GROUP BY `userId` HAVING SUM(`total`) > 100;
总结
Sequelize 提供了丰富的附加选项参数,能够满足开发者在复杂查询时的需求,例如 where、include、attributes、limit、offset、order、group 和 having 等,熟练掌握这些选项能够提高开发效率,并为代码维护带来更多便利。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f1e227d4982a6eb8a43e5