Sequelize 急切加载错误

Posted

技术标签:

【中文标题】Sequelize 急切加载错误【英文标题】:Sequelize Eager Loading Error 【发布时间】:2018-03-18 18:21:27 【问题描述】:

我遇到了一个问题,即我的查询中的 include 不起作用,我不知道为什么。我有两个模型:问题和建议。

Question:
var Question = sequelize.define('Question', 
  , 
    classMethods: 
      associate: function (models) 
        // associations can be defined here
        Question.belongsTo(models.User, 
          as: 'askerId',
          foreignKey: 'askerId'
        )

        Question.belongsTo(models.User, 
          as: 'winnerId',
          foreignKey: 'winnerId'
        )

        Question.hasMany(models.Suggestion)
        Question.hasMany(models.TagQuestion)
      
    
  )

建议:

var Suggestion = sequelize.define('Suggestion', 
    text: DataTypes.STRING
  , 
    classMethods: 
      associate: function (models) 
        // associations can be defined here
        Suggestion.belongsTo(models.Question, 
          foreignKey: 'questionId',
          as: 'question'
        )

        Suggestion.belongsTo(models.User)

        Suggestion.hasMany(models.Vote)
      
    
  )

我尝试的查询在这里:

Question.findAll(
    include: [
      model: models.Suggestion
    ]
  )

但我不断收到错误消息:SequelizeEagerLoadingError: Suggestion is not associated to Question!

为什么它们没有关联?它们在我的数据库中(基于我编写的迁移)。如果我目前做错了,我应该如何建立我的关联?我查看了其他有此问题的人,但无法弄清楚为什么我的关联是错误的。

【问题讨论】:

你用的是什么版本的sequelize?如果 gt v4 在主题 How sequelize works? 中看到我的答案(在 sequelize v4 中删除了 classMethods 和 instanceMethods) 是的,这很有帮助。我在连接表查询方面仍然存在一些问题(它已链接,但没有找到通过连接表链接的对象)。 更新您的问题,添加您实际所做的示例。什么类型的协会?或者您对所有类型都有错误?你遇到了什么错误? docs.sequelizejs.com/manual/tutorial/… 来自官方文档:如果关联有别名(使用 as 选项),则在包含模型时必须指定此别名。 【参考方案1】:

我遇到了这个错误,因为我的语法不好。我正在使用

include: 
  model: db.modelOne,
  model: db.modelTwo

没有括号 []。包括它解决了错误。 无论如何,mentioned docs 提供了这个更简洁的选项来递归地包含所有外国模型:

User.findAll( include: [ all: true, nested: true ]);

【讨论】:

为链接添加描述【参考方案2】:

Sequelize 不再支持 classMethods。 classMethods 和 instanceMethods 被移除。

上一个:

const Model = sequelize.define('Model', 
    ...
, 
    classMethods: 
        associate: function (model) ...
    ,
    instanceMethods: 
        someMethod: function ()  ...
    
);

新:

const Model = sequelize.define('Model', 
    ...
);

// 类方法

Model.associate = function (models) 
    ...associate the models`enter code here`
;

参考:http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#breaking-changes

【讨论】:

【参考方案3】:

请查看您的init-models.js,代码如下:

  question.hasMany(suggestion,  as: 'suggestion', foreignKey: 'questionId');
  suggestion.belongsTo(question,  as: 'question', foreignKey: 'questionId');

存在吗?

来自

"sequelize": "^6.6.2"

【讨论】:

以上是关于Sequelize 急切加载错误的主要内容,如果未能解决你的问题,请参考以下文章

在使用急切加载的 findOne Sequelize 方法期间,Nodejs 堆内存不足

Sequelize嵌套的渴望加载找到所有嵌套关联不匹配的地方

Sequelize 关联 hasOne,belongsTo

如何将对象推入数组?

在 Sequelize 中限制延迟加载的关联

NodeJS sequelize 自动生成模型并运行迁移 SQL 语法错误