database - 仅从 sequelize 原始查询而不是模型实例中获取 dataValues
问题描述
我正在使用 sequelize 并使用原始查询从表中获取数据。但是我得到了所有模型实例,而我只需要 dataValues。我的设置如下所示:
const sequelize = new Sequelize({
database: process.env.PGDATABASE,
username: process.env.PGUSER,
password: process.env.PGPASS,
host: process.env.PGHOST,
port: process.env.PGPORT,
dialect: "postgres"
});
getPostGres: () => {
return sequelize;
}
我查询数据库的方式如下所示:
let messageRatingsArr = await getPostGres().query(
`SELECT mr.support_email, mr.support_name,
(select count(mrn."chatId") as total FROM message_ratings as mrn WHERE mrn."ratingType"='NEGATIVE' and mr.support_email = mrn.support_email) as negative,
(select count(mrp."chatId") as total FROM message_ratings as mrp WHERE mrp."ratingType"='POSITIVE' and mr.support_email = mrp.support_email) as positive,
(select count(mrm."chatId") as total FROM message_ratings as mrm WHERE mrm."ratingType"='MIXED' and mr.support_email = mrm.support_email) as mixed,
(select count(mru."chatId") as total FROM message_ratings as mru WHERE mru."ratingType"='NEUTRAL' and mr.support_email = mru.support_email) as neutral
FROM message_ratings mr
WHERE mr."createdAt" >= '${properFromDate}' AND mr."createdAt" <= '${properToDate}'
group by mr.support_email, mr.support_name
limit ${args.count} offset ${args.offset} `,
{
model: MessageRatingPG,
mapToModel: true
}
);
let messageRatings = messageRatingsArr.map(item=>{
return item.dataValues;
})
let result = connectionFromArray(messageRatings, args);
result.totalCount = messageRatings.length;
return result;
如您所见,由于我正在映射查询中的数据,其中包含各种数据,如 dataValues、_options、isNewRecord 等,如果我有一个大数据集,则循环遍历数组效率不高,所以我能做什么只获取dataValues?
解决方案
来自https://sequelize.org/master/manual/raw-queries.html:
如果您不需要访问元数据,您可以传入查询类型来告诉 sequelize 如何格式化结果。例如,对于一个简单的选择查询,您可以这样做:
sequelize.query("SELECT * FROM `users`", { type: sequelize.QueryTypes.SELECT})
.then(users => {
// We don't need spread here, since only the results will be returned for select queries
})
现在,查看您的代码,并与文档中的下一段进行比较:
第二个选项是模型。如果您传递模型,则返回的数据将是该模型的实例。
// Callee is the model definition. This allows you to easily map a query to a predefined model
sequelize
.query('SELECT * FROM projects', {
model: Projects,
mapToModel: true // pass true here if you have any mapped fields
})
.then(projects => {
// Each record will now be an instance of Project
})
我建议从您的原始代码中删除以下内容:
{
model: MessageRatingPG,
mapToModel: true
}
并将其替换为{ type: sequelize.QueryTypes.SELECT }
推荐阅读
- sql - 将采样线的颜色更改为 apex oracle
- html - 如何使用 html post 提交动态表格
- python - 将 300 个短时间序列作为 pandas 数据帧远程存储和检索的最快方法
- scala - 如何通过传入变量而不是文字来使用多列的 groupBy
- javafx - 为什么这个 JavaFX 播放器会死机?
- c - 为什么它给我错误“格式参数太多 [-Wformat-extra-args]
- c++ - 为什么类静态 constexpr 值不能依赖于类静态 constexpr 函数?
- html - 为什么 WhatsApp 链接共享中没有显示图像?
- react-native - 重新渲染平面列表的问题
- reactjs - 当父组件重新渲染时,使用 `react-redux` 的子组件的行为如何改变?