Sequelize Migration:关系 <table> 不存在

Posted

技术标签:

【中文标题】Sequelize Migration:关系 <table> 不存在【英文标题】:Sequelize Migration: relation <table> does not exist 【发布时间】:2018-11-29 17:07:14 【问题描述】:

我正在处理 Author hasMany Books 示例并尝试运行 sequelize-cli 迁移,但在运行以下迁移时遇到以下问题:

ERROR: relation "authors" does not exist

这是创建作者的第一个迁移:

'use strict';
module.exports = 
  up: (queryInterface, Sequelize) => 
    return queryInterface.createTable('Authors', 
      id: 
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      ,
      firstName: 
        type: Sequelize.STRING
      ,
      lastName: 
        type: Sequelize.STRING
      ,
      dateOfBirth: 
        type: Sequelize.DATEONLY
      ,
      dateOfDeath: 
        type: Sequelize.DATEONLY
      ,
      createdAt: 
        allowNull: false,
        type: Sequelize.DATE
      ,
      updatedAt: 
        allowNull: false,
        type: Sequelize.DATE
      
    );
  ,
  down: (queryInterface, Sequelize) => 
    return queryInterface.dropTable('Authors');
  
;

创建书籍的第二次迁移:

'use strict';
module.exports = 
  up: (queryInterface, Sequelize) => 
    return queryInterface.createTable('Books', 
      id: 
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      ,
      title: 
        type: Sequelize.STRING
      ,
      summary: 
        type: Sequelize.STRING
      ,
      isbn: 
        type: Sequelize.STRING
      ,
      createdAt: 
        allowNull: false,
        type: Sequelize.DATE
      ,
      updatedAt: 
        allowNull: false,
        type: Sequelize.DATE
      
    );
  ,
  down: (queryInterface, Sequelize) => 
    return queryInterface.dropTable('Books');
  
;

在 Author 和 Book 之间创建关系的迁移:

'use strict';

module.exports = 
  up: (queryInterface, Sequelize) => 
    return queryInterface.addColumn(
      'Books', // name of source model
      'AuthorId',
      
        type: Sequelize.INTEGER,
        references: 
          model: 'authors',
          key: 'id'
        ,
        onUpdate: 'CASCADE',
        onDelete: 'SET NULL'
      
    )
  ,

  down: (queryInterface, Sequelize) => 
    return queryInterface.removeColumn(
      'Books',
      'AuthorId'
    )
  
;

这些是我的模型:

作者.js:

'use strict';
module.exports = (sequelize, DataTypes) => 
  var Author = sequelize.define('Author', 
    firstName:  type: DataTypes.STRING, allowNull: false, len: [2, 100] ,
    lastName:  type: DataTypes.STRING, allowNull: false ,
    dateOfBirth:  type: DataTypes.DATEONLY ,
    dateOfDeath:  type: DataTypes.DATEONLY 
  , );
  Author.associate = function (models) 
    // associations can be defined here
    Author.hasMany(models.Book);
  ;
  return Author;
;

book.js:

'use strict';
module.exports = (sequelize, DataTypes) => 
  var Book = sequelize.define('Book', 
    title:  type: DataTypes.STRING, allowNull: false, len: [2, 100], trim: true ,
    summary:  type: DataTypes.STRING, allowNull: false ,
    isbn:  type: DataTypes.STRING, allowNull: false 
  , );

  Book.associate = function (models) 
    // associations can be defined here
    Book.belongsTo(models.Author);
  ;
  return Book;
;

我尝试了各种方法都无济于事。我的猜测是它正在尝试以异步方式更改表,但之前的迁移运行并完成了:

我正在使用以下内容:

"pg": "^7.4.3"
"sequelize": "^4.37.10"
"sequelize-cli": "^4.0.0"
 "express": "~4.16.0"

我是续集的新手,任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,我按照 here 解释的“模型同步”解决了它。

在文档中解释说,使用 MODELNAME.sync() sequelize 检查表是否存在,如果不存在,则此函数创建表。这个函数有一些选项:

User.sync() - 如果表不存在则创建表(如果表已存在则不执行任何操作) User.sync( force: true ) - 这会创建表,如果它已经存在则首先删除它 User.sync( alter: true ) - 这会检查数据库中表的当前状态(它有哪些列,它们的数据类型是什么等),然后在表中执行必要的更改以使其与模型匹配。

您可以使用sequelize.sync()自动同步所有模型。

【讨论】:

【参考方案2】:

我遇到了类似的问题,所以我是如何解决的 -

    复制该迁移文件中的代码并删除该迁移文件。

    然后我生成了一个新的迁移文件并粘贴了我之前复制的代码并运行 sequelize db:migrate 并且它起作用了。

【讨论】:

【参考方案3】:

您已经创建了Authors 表,但是用一个小的a 引用它。应该是这样的

references: 
  model: 'Authors',
  key: 'id'
,

【讨论】:

谢谢 - 无法告诉你我尝试了多少不同的东西,但不知何故忽略了那个迭代!

以上是关于Sequelize Migration:关系 <table> 不存在的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite外键不匹配sequelize迁移

Sequelize 正在运行的迁移结果无法读取未定义的属性“键”

用 graphql-sequelize 解决“IS A”关系

Sequelize - 自我引用有很多关系

使用 Sequelize.js 时在哪里定义关联/关系?

如何使用 sequelize 和 mysql 创建一对一的关系?