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> 不存在的主要内容,如果未能解决你的问题,请参考以下文章
Sequelize 正在运行的迁移结果无法读取未定义的属性“键”