【问题标题】:referencing a model that hasn't been created, avoid the error: relation "TABLENAME" does not exist引用尚未创建的模型,避免错误:关系“TABLENAME”不存在
【发布时间】:2019-12-05 15:16:16
【问题描述】:

我对 sequelize 和 postgresql 很陌生。我寻找了很多关于这个问题的答案,但我找不到任何与我相关的东西。如果这个问题在另一篇文章中有答案,我很抱歉重复,我很乐意参考另一篇文章并从这里删除我的帖子。

一开始我是这样做的:

sequelize model:generate --name user --attributes username:string,email:string,password:string,collection_id:INTEGER

其中collection_id 引用另一个表ID。我对集合表做了同样的事情:

sequelize model:generate --name collection --attributes plant_id:integer,user_id:integer

在我的模型中,我更新了关联 在我添加的集合模型中:

models.collection.belongsTo(models.user, {foreignKey: 'user_id'})

在我添加的用户模型中:

models.user.hasOne(models.collection, {foreignKey: 'collection_id'})

在我添加的迁移文件中:

user_id: {
        type: Sequelize.INTEGER,
        references: {
          model: {
            tableName: 'user'
          }
        }
  }

collection_id: {
        type: Sequelize.INTEGER,
        references: {
          model: {
            tableName: 'collection'
          }
        }
      }

在他们各自的文件中。现在这里的问题是,sequelize 试图在集合模型之前迁移用户模型,但是后者在第一个模型中被引用,我得到这个错误“关系“集合”不存在”,这才有意义。现在如果我删除了引用,有没有办法在我迁移后添加它?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    reference 在引擎盖下的桌子上设置一个外键。但是你不能有两个外键指向彼此的表(循环引用)。

    您在指向“父”表的“子”表上设置了一个外键。在您的情况下,如果 collection 属于 user 则 collection 是“孩子”。

    您可以阅读此paragraph from Sequalize docs,其中包含有关hasOne 和belongsTo 之间区别的一些详细信息(也可以单独阅读Sequalize 中的这些关联)。您传递给 hasOne 方法的 {foreignKey: 'collection_id'} 实际上应该在 collections 表(target 模型)中,这意味着在您的情况下它没有意义,应该是这样的:

    models.user.hasOne(models.collection, {foreignKey: 'user_id'})
    

    因此,您的user 表中不需要collection_id 列,可以安全地删除它。

    【讨论】:

    • 我从用户表中删除了引用并解决了问题。它们现在仅通过集合表中的 user_id 链接。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2017-05-18
    • 2013-01-30
    • 2017-11-19
    • 2021-12-22
    • 2020-11-23
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多