【问题标题】:Specifying specific fields with Sequelize (NodeJS) instead of *使用 Sequelize (NodeJS) 而不是 * 指定特定字段
【发布时间】:2011-12-23 19:21:01
【问题描述】:

好的,所以我在 NodeJS 中有一个项目,我将 Sequelize 用于 MySQL ORM。这件事非常有效,但是我试图弄清楚是否有一种方法可以指定基于查询返回哪些字段,或者是否有一种方法可以在某处执行 .query() 。

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

【问题讨论】:

  • 哦,哇,现在有关于它的文档:-/ 蹩脚。 alessioalex 是对的。

标签: mysql node.js sequelize.js


【解决方案1】:

版本中试试这个

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

【讨论】:

  • 我觉得这个答案令人困惑。为什么attributes,一个数组,说//objectwhere 也发生了类似的情况,它显示为 //array,但如果看起来像单个值(numberstring)。
  • @Camilo 哎呀没关系,忽略评论。它可以是数组、嵌套数组或对象。更多细节,你可以看看sequelize.org/master/manual/model-querying-basics.html
【解决方案2】:

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

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

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

Source

【讨论】:

  • 这就是我想要的。谢谢
【解决方案3】:

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

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 = ...;

【讨论】:

    【解决方案4】:

    您必须将属性指定为传递给 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

    【讨论】:

    • 嘿,你能检查一下链接吗,它们似乎坏了
    猜你喜欢
    • 2020-07-24
    • 2020-10-02
    • 2013-10-26
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多