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

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)

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


Suv*_*tha 6

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

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)