NodeJS的sequelize操作数据库
排序和分组
order
and group
参数,与 ORDER BY
和 GROUP BY
可以一起使用
order
参数用来让 sequelize 方法对查询进行排序. 这些列本身是 [column, direction]
形式的数组(如 ASC
, DESC
, NULLS FIRST
等)
Subtask.findAll({ order: [ // 将转义 title 并针对有效方向列表进行降序排列 ['title', 'DESC'], // 将按最大年龄进行升序排序 sequelize.fn('max', sequelize.col('age')), // 将按最大年龄进行降序排序 [sequelize.fn('max', sequelize.col('age')), 'DESC'], // 将按 otherfunction(`col1`, 12, 'lalala') 进行降序排序 [sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'], // 将使用模型名称作为关联名称按关联模型的 createdAt 排序. [Task, 'createdAt', 'DESC'], // 将使用模型名称作为关联名称通过关联模型的 createdAt 排序. [Task, Project, 'createdAt', 'DESC'], // 将使用关联名称按关联模型的 createdAt 排序. ['Task', 'createdAt', 'DESC'], // 将使用关联的名称按嵌套的关联模型的 createdAt 排序. ['Task', 'Project', 'createdAt', 'DESC'], // 将使用关联对象按关联模型的 createdAt 排序. (首选方法) [Subtask.associations.Task, 'createdAt', 'DESC'], // 将使用关联对象按嵌套关联模型的 createdAt 排序. (首选方法) [Subtask.associations.Task, Task.associations.Project, 'createdAt', 'DESC'], // 将使用简单的关联对象按关联模型的 createdAt 排序. [{model: Task, as: 'Task'}, 'createdAt', 'DESC'], // 将由嵌套关联模型的 createdAt 简单关联对象排序. [{model: Task, as: 'Task'}, {model: Project, as: 'Project'}, 'createdAt', 'DESC'] ], // 将按最大年龄降序排列 order: sequelize.literal('max(age) DESC'), // 如果忽略方向,则默认升序,将按最大年龄升序排序 order: sequelize.fn('max', sequelize.col('age')), // 如果省略方向,则默认升序, 将按年龄升序排列 order: sequelize.col('age'), // 将根据方言随机排序(但不是 fn('RAND') 或 fn('RANDOM')) order: sequelize.random() }); Foo.findOne({ order: [ // 将返回 `name` ['name'], // 将返回 `username` DESC ['username', 'DESC'], // 将返回 max(`age`) sequelize.fn('max', sequelize.col('age')), // 将返回 max(`age`) DESC [sequelize.fn('max', sequelize.col('age')), 'DESC'], // 将返回 otherfunction(`col1`, 12, 'lalala') DESC [sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'], // 将返回 otherfunction(awesomefunction(`col`)) DESC, 这种嵌套可能是无限的! [sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC'] ] }); 复制代码
order
数组的元素可以如下:
一个字符串 (它将被自动引用)
一个数组, 其第一个元素将被引用,第二个将被逐字追加
一个具有
raw
字段的对象:raw
内容将不加引用地逐字添加其他所有内容都将被忽略,如果未设置
raw
,查询将失败调用
Sequelize.fn
(这将在 SQL 中生成一个函数调用)调用
Sequelize.col
(这将引用列名)
分组
分组和排序的语法相同,只是分组不接受排列顺序作为数组的最后一个参数(不存在 ASC
, DESC
, NULLS FIRST
等),将字符串直接传递给 group
User.findAll({ group: 'name' }); // 生成 'GROUP BY name' 复制代码
限制和分页
limit
和 offset
参数可以进行 限制/分页,一般和 order
参数一起使用.
// 提取10个实例/行 User.findAll({ limit: 10 }); // 跳过8个实例/行 User.findAll({ offset: 8 }); // 跳过5个实例,然后获取5个实例 User.findAll({ offset: 5, limit: 5 });
作者:LTAND
链接:https://juejin.cn/post/7036001092752113671
伪原创工具 SEO网站优化 https://www.237it.com/