如何在Sequelize现有模型中添加列?

时间:2018-04-18 04:04:32

标签: node.js database orm sequelize.js sequelize-cli

我已使用此命令添加了模型和迁移文件

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;
};

提前谢谢你:)

3 个答案:

答案 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(...)]),以便其返回承诺,因此可能会引发错误。干杯!