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

Posted

技术标签:

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

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

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

【问题讨论】:

哦,哇,现在有关于它的文档:-/ 蹩脚。 alessioalex 是对的。 【参考方案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

【讨论】:

嘿,你能检查一下链接吗,它们似乎坏了

以上是关于使用 Sequelize (NodeJS) 而不是 * 指定特定字段的主要内容,如果未能解决你的问题,请参考以下文章

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

如何在 SEQUELIZE (nodeJS) 中创建触发器?

如何使用nodejs sequelize执行此SQL查询?

使用 sequelize 和 nodejs 更新多条记录?

仅从 sequelize 原始查询而不是模型实例中获取 dataValues

nodejs使用Sequelize框架操作数据库