使用Sequelize(NodeJS)而不是*指定特定字段

时间:2011-11-07 17:08:54

标签: mysql node.js sequelize.js

好的,所以我在NodeJS中有一个项目,我正在使用Sequelize进行MySQL ORM。事情很奇妙但是我想弄清楚是否有办法在查询的基础上指定哪些字段被返回,或者是否有一种方法只是在某处做.query()。

例如,在我们的用户数据库中,可能会有大量的记录和列。在这种情况下,我只需要返回三列,这样就可以更快地获得这些列。但是,Sequelize只是在表中查询所有“*”以尽可能地满足完整对象模型。这是我想在应用程序的这个特定区域中绕过的功能。

4 个答案:

答案 0 :(得分:64)

您必须将属性指定为传递给findAll()的对象中的属性:

Project.findAll({attributes: ['name', 'age']}).on('success', function (projects) {
  console.log(projects);
});

我是如何找到这个的:

首先在此处调用查询:https://github.com/sdepold/sequelize/blob/master/lib/model-definition.js#L131
然后在这里构建:https://github.com/sdepold/sequelize/blob/master/lib/connectors/mysql/query-generator.js#L56-59

答案 1 :(得分:7)

版本

中试用
template.findAll({
    where: {
        user_id: req.params.user_id //array
    },
    attributes: ['id', 'template_name'], //object
}).then(function (list) {
    res.status(200).json(list);
})

答案 2 :(得分:1)

使用属性键中的数组。您可以为别名创建嵌套数组。

Project.findAll({
  attributes: ['id', ['name', 'project_name']],
  where: {id: req.params.id}
})
.then(function(projects) {
  res.json(projects);
})

将产生产量:

SELECT id, name AS project_name FROM projects WHERE id = ...;

答案 3 :(得分:0)

所有答案都是正确的,但我们也可以使用includeexclude

Model.findAll({
  attributes: { include: ['id'] }
});

Model.findAll({
  attributes: { exclude: ['createdAt'] }
});

Source