mysql - 关联 : how to eager load, 序列,原始 : true?

标签 mysql node.js sequelize.js

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 查询中获取的内容。

我认为在您的情况下,您应该在循环中使用 limitoffset 选项来按 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/

相关文章:

mysql - Sequelize 不会在填充表上创建外键列

php - 我是否需要打开 MySQL 端 Eloquent 能使 DigitalOcean LAMP 应用程序正常工作?

mysql - 设置用户权限时“SHOW command denied to user”

MySQL 如何在左连接中计算 where 子句仅用于计数?

Mongoose 查询时Javascript变量范围

javascript - sequelize 多对多 setter 不存在

java - JPA:删除的外键约束

javascript - 如何使用groupby方法在sequelize postgres中获取特定id的表特定数据

mysql - 使用 Sequelize.js 加入特定列

javascript - Sequelize 自引用多对多;如何指定我要加入的内容