Mysql Sequelize:如何使用关联快速加载,原始:真?
在Node.js中快速加载是我知道如何使用Sequelize的唯一方法。我正在尝试使用嵌套的includes从MySQL数据库导出所有用户调查数据。有超过500k行的调查答案,我的脚本由于为返回的每一行创建一个实例而内存不足而崩溃 我想将查询设为“raw”,只获取简单的对象数据,但它只返回每个include的第一个关联记录,而不是包含它们的数组。是否有任何方法可以获取所有相关记录并使其成为原始记录?或者Sequelize不应该以这种方式用于大型查询?我的问题是:Mysql Sequelize:如何使用关联快速加载,原始:真?,mysql,node.js,sequelize.js,Mysql,Node.js,Sequelize.js,在Node.js中快速加载是我知道如何使用Sequelize的唯一方法。我正在尝试使用嵌套的includes从MySQL数据库导出所有用户调查数据。有超过500k行的调查答案,我的脚本由于为返回的每一行创建一个实例而内存不足而崩溃 我想将查询设为“raw”,只获取简单的对象数据,但它只返回每个include的第一个关联记录,而不是包含它们的数组。是否有任何方法可以获取所有相关记录并使其成为原始记录?或者Sequelize不应该以这种方式用于大型查询?我的问题是: db.User.findAll(
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添加到顶级,并在各个include中的任何地方添加,但似乎没有任何效果。我是否应该尝试根据答案进行查询,以便所有关系只需要一条记录?或者,有没有一种方法可以使这些复杂的查询成为原始查询,并包括所有相关的记录?感谢阅读,这让我困惑了好几天。正如Sequelize文档中所说的
raw
选项:
sequelize不会尝试格式化查询结果,也不会构建
结果中的模型实例
这意味着,若您有1条主记录和2条关联记录,您将得到2条记录,因为Sequelize从SQL查询中得到了这两条记录
我想在您的例子中,您应该在一个循环中使用limit
和offset
选项来按块获取记录。这样就不会导致内存不足的结果
另外,要获取普通对象而不是模型,请对每个模型使用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 }))
正如Sequelize文档所述,关于
raw
选项:
sequelize不会尝试格式化查询结果,也不会构建
结果中的模型实例
这意味着,若您有1条主记录和2条关联记录,您将得到2条记录,因为Sequelize从SQL查询中得到了这两条记录
我想在您的例子中,您应该在一个循环中使用limit
和offset
选项来按块获取记录。这样就不会导致内存不足的结果
另外,要获取普通对象而不是模型,请对每个模型使用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 }))