续集迁移:关系 <table> 不存在
Sequelize Migration: relation <table> does not exist
我正在研究 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');
}
};
在作者和书籍之间创建关系的迁移:
'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'
)
}
};
这些是我的模型:
author.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;
};
我试过各种方法都无济于事。我的猜测是它试图以异步方式更改 table,但之前的迁移 运行 并已完成:
我正在使用以下内容:
"pg": "^7.4.3"
"sequelize": "^4.37.10"
"sequelize-cli": "^4.0.0"
"express": "~4.16.0"
我是续集的新手,如有任何帮助,我们将不胜感激!
您已经创建了 Authors
table,但是用一个小 a
引用它。应该是
references: {
model: 'Authors',
key: 'id'
},
我遇到了类似的问题,所以我是如何解决的 -
正在复制该迁移文件中的代码并删除迁移文件。
然后我生成了一个新的迁移文件并粘贴了我之前复制的代码和 运行 sequelize db:migrate
并且成功了。
我有一个类似的问题,我按照解释的“模型同步”解决了它 here。
在文档中解释说,使用 MODELNAME.sync() sequelize 检查 table 是否存在,如果不存在,则此函数创建 table。这个函数有一些选项:
User.sync()
- 如果 table 不存在则创建它(如果它已经存在则什么都不做)
User.sync({ force: true })
- 这会创建 table,如果它已经存在则先删除它
User.sync({ alter: true })
- 这会检查数据库中 table 的当前状态(它有哪些列,它们的数据类型是什么,等等),然后在 [=24= 中执行必要的更改] 使其与模型匹配。
您可以使用sequelize.sync()
自动同步所有模型。
我正在研究 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');
}
};
在作者和书籍之间创建关系的迁移:
'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'
)
}
};
这些是我的模型:
author.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;
};
我试过各种方法都无济于事。我的猜测是它试图以异步方式更改 table,但之前的迁移 运行 并已完成:
我正在使用以下内容:
"pg": "^7.4.3"
"sequelize": "^4.37.10"
"sequelize-cli": "^4.0.0"
"express": "~4.16.0"
我是续集的新手,如有任何帮助,我们将不胜感激!
您已经创建了 Authors
table,但是用一个小 a
引用它。应该是
references: {
model: 'Authors',
key: 'id'
},
我遇到了类似的问题,所以我是如何解决的 -
正在复制该迁移文件中的代码并删除迁移文件。
然后我生成了一个新的迁移文件并粘贴了我之前复制的代码和 运行
sequelize db:migrate
并且成功了。
我有一个类似的问题,我按照解释的“模型同步”解决了它 here。
在文档中解释说,使用 MODELNAME.sync() sequelize 检查 table 是否存在,如果不存在,则此函数创建 table。这个函数有一些选项:
User.sync()
- 如果 table 不存在则创建它(如果它已经存在则什么都不做)
User.sync({ force: true })
- 这会创建 table,如果它已经存在则先删除它
User.sync({ alter: true })
- 这会检查数据库中 table 的当前状态(它有哪些列,它们的数据类型是什么,等等),然后在 [=24= 中执行必要的更改] 使其与模型匹配。
您可以使用sequelize.sync()
自动同步所有模型。