Aja*_*iya 6 database orm node.js sequelize.js sequelize-cli
我已使用此命令添加了模型和迁移文件
node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string
Run Code Online (Sandbox Code Playgroud)
现在,我想在现有表(模型)中添加一些字段,如性别和年龄。我手动更改了模型并触发了此命令
node_modules/.bin/sequelize db:migrate
Run Code Online (Sandbox Code Playgroud)
但它的回应是“未执行任何迁移,数据库架构已经是最新的。”
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;
};
Run Code Online (Sandbox Code Playgroud)
先感谢您 :)
小智 9
在您的续集初始化中添加altertrue 属性,并将列或关联添加到现有模型文件中。
db.sequelize.sync({ force: false, alter: true })
Run Code Online (Sandbox Code Playgroud)
来自相关文档:
User.sync({ alter: true })
Run Code Online (Sandbox Code Playgroud)
这会检查数据库中表的当前状态(它有哪些列,它们的数据类型是什么等),然后在表中执行必要的更改以使其与模型匹配。
为了向表中添加新字段,我们应该使用迁移框架,如下所示。
sequelize migration:create --name Users
Run Code Online (Sandbox Code Playgroud)
打开迁移文件并添加以下代码
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
}
};
Run Code Online (Sandbox Code Playgroud)
然后只需运行迁移
node_modules/.bin/sequelize db:migrate
Run Code Online (Sandbox Code Playgroud)
注意:传递的queryInterface对象可用于修改数据库。所述Sequelize对象存储可用的数据类型,如字符串或整数。
我希望这能帮到您。如果您有任何问题,请通知我。
小智 5
Suvethan的答案是正确的,但是迁移代码片段有一个小错误。Sequelize迁移期望将返回一个承诺,这在生成的迁移框架的注释中指出:
Add altering commands here.
Return a promise to correctly handle asynchronicity.
Example:
return queryInterface.createTable('users', { id: Sequelize.INTEGER });
Run Code Online (Sandbox Code Playgroud)
因此,返回一组承诺可能会导致意外结果,因为无法保证在继续下一次迁移之前,所有承诺都会得到解决。对于大多数操作,您几乎不会遇到任何问题,因为大多数事情将在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
}
};
Run Code Online (Sandbox Code Playgroud)