使用 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
,一个数组,说//object
? where
也发生了类似的情况,它显示为 //array
,但如果看起来像单个值(number
或 string
)。
@Camilo 哎呀没关系,忽略评论。它可以是数组、嵌套数组或对象。更多细节,你可以看看sequelize.org/master/manual/model-querying-basics.html【参考方案2】:
所有答案都是正确的,但我们也可以使用 include
和 exclude
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) 中创建触发器?