Node.js 中的预加载是我知道如何使用 Sequelize 的唯一方法。我正在尝试从具有嵌套包含的 MySQL 数据库导出所有用户调查数据。有超过 50 万行的调查答案,由于为返回的每一行创建一个实例,我的脚本因内存不足而崩溃。
我想让查询成为“原始”并只获取简单的对象数据,但它只返回每个包含的第一个关联记录,而不是包含所有这些记录的数组。有什么方法可以获取所有相关记录并使其原始吗?或者 Sequelize 不应该以这种方式用于大型查询吗?这是我的查询:
db.User.findAll({
include: [
{ model: db.Referrer }, // has one Referrer
{ model: db.Individual }, // has many Individuals (children)
{
model: db.UserSurvey, // has many UserSurveys
include: {
model: db.Answer, // UserSurveys have many Answers
include: {
model: db.Question // survey question definition
}
}
}
],
raw: true // only returns first Individual, UserSurvey, Answer, etc.
nest: true // unflattens but does not fix problem
})
如果我限制返回的行,此查询可以正常工作。如果我不限制它,它只会因数据集的大小而崩溃。我尝试将 raw 添加到顶层以及各种包含中的任何地方,但似乎没有任何效果。我是否应该尝试将查询基于“答案”,以便所有关系只需要一条记录?或者有没有办法使这些复杂的查询变得原始并包含所有相关记录?感谢您的阅读,这让我困惑了几天。
最佳答案
正如 Sequelize 文档中关于 raw
选项所述:
sequelize will not try to format the results of the query, or build an instance of a model from the result
这意味着,如果您有 1 条主记录和 2 条关联记录,您将获得 2 条记录,因为这是 Sequelize 从 SQL 查询中获取的内容。
我认为在您的情况下,您应该在循环中使用 limit
和 offset
选项来按 block 获取记录。这样就不会导致内存不足的结果。
此外,要获取普通对象而不是模型,请对每个模型使用 get({ plain: true })
,如下所示:
const users = db.User.findAll({
include: [
{ model: db.Referrer }, // has one Referrer
{ model: db.Individual }, // has many Individuals (children)
{
model: db.UserSurvey, // has many UserSurveys
include: {
model: db.Answer, // UserSurveys have many Answers
include: {
model: db.Question // survey question definition
}
}
}
]
})
const plainUsers = users.map(x => x.get({ plain: true }))
关于mysql - 关联 : how to eager load, 序列,原始 : true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64546830/