我已使用此命令添加了模型和迁移文件
node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string
现在我想在现有的表(模型)中添加更多性别和年龄等字段。我手动更改了模型并触发了此命令
node_modules/.bin/sequelize db:migrate
但它正在响应#34;没有执行任何迁移,数据库架构已经是最新的。 "
User.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var User = sequelize.define('User', {
firstName: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING
}, {});
User.associate = function(models) {
// associations can be defined here
};
return User;
};
提前谢谢你:)
答案 0 :(得分:5)
为了向表中添加新字段,我们应该使用迁移框架,如下所示。
sequelize migration:create --name Users
打开迁移文件并添加以下代码
module.exports = {
up: function (queryInterface, Sequelize) {
return [ queryInterface.addColumn(
'Users',
'gender',
Sequelize.STRING
),
queryInterface.addColumn(
'Users',
'age',
Sequelize.STRING
)];
},
down: function (queryInterface, Sequelize) {
// logic for reverting the changes
}
};
然后只需运行迁移
node_modules/.bin/sequelize db:migrate
注意:传递的 queryInterface 对象可用于修改数据库。 Sequelize 对象存储可用的数据类型,例如STRING或INTEGER。
Full list of methods in Query Interface
我希望这会对你有所帮助。如果您有任何问题,请告诉我。
答案 1 :(得分:3)
Suvethan's answer是正确的,但是迁移代码段中有一个小错误。 Sequelize迁移期望返回承诺,这在生成的迁移框架的注释中指出:
Add altering commands here.
Return a promise to correctly handle asynchronicity.
Example:
return queryInterface.createTable('users', { id: Sequelize.INTEGER });
因此,返回一组承诺可能会导致意外结果,因为无法保证在继续下一次迁移之前,所有的承诺都会得到解决。对于大多数操作,您几乎不会遇到任何问题,因为大多数事情将在Sequelize关闭该过程之前完成。但是,我认为在进行数据库迁移时要比后悔更安全。您仍然可以利用一系列承诺;您只需要将其包装在Promise.all
调用中即可。
Suvethan的示例,但带有Promise.all:
module.exports = {
up: function (queryInterface, Sequelize) {
return Promise.all([
queryInterface.addColumn(
'Users',
'gender',
Sequelize.STRING
),
queryInterface.addColumn(
'Users',
'age',
Sequelize.STRING
)
]);
},
down: function (queryInterface, Sequelize) {
// logic for reverting the changes
}
};
答案 2 :(得分:0)
除了@Suvethan Nantha的回答对我有所帮助外,请确保将查询包装在 Promise.all 中,即返回**Promise.all**([queryInterface.addColumn(...)])
,以便其返回承诺,因此可能会引发错误。干杯!