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

How to add column in Sequelize existing model?

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

node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string

现在我想在现有 table(model) 中添加更多字段,例如性别和年龄。我手动更改模型并触发此命令

node_modules/.bin/sequelize db:migrate

但它回应说“没有执行任何迁移,数据库架构已经是最新的。 “

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

提前谢谢你:)

为了向 table 添加新字段,我们应该使用如下所示的迁移框架。

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

希望对您有所帮助。如果您有任何问题,请告诉我。

是正确的,但是迁移代码片段有一个小错误。 Sequelize 迁移期望返回一个 promise,这在生成的迁移框架的注释中有注明:

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

除了 @Suvethan Nantha 的回答对我有帮助之外,请确保将查询包装在 Promise.all 中,即 return **Promise.all**([queryInterface.addColumn(...)]) 这样它将 return 一个承诺,因此可能会抛出错误。干杯!

在你的 sequelize 初始化中添加 alter 属性 为真,并将列或关联添加到你现有的模型文件中。

db.sequelize.sync({ force: false, alter: true })

来自相关 documentation:

User.sync({ alter: true }) 

这会检查数据库中 table 的当前状态(它有哪些列,它们的数据类型是什么,等等),然后在 table 中执行必要的更改使其与模型匹配。