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

Posted

技术标签:

【中文标题】如何在 Sequelize 现有模型中添加列?【英文标题】:How to add column in Sequelize existing model? 【发布时间】:2018-09-28 04:21:38 【问题描述】:

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

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

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

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

提前谢谢你:)

【问题讨论】:

能否将 User.js 文件附加到问题中? 我已经添加了 user.js 文件!请检查 检查答案,如果您有困难,请告诉我 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

除了 @Suvethan Nantha 的回答顺便帮助了我,确保你将查询包装在 Promise.all 中,即返回 **Promise.all**([queryInterface.addColumn(...)]) 以便它返回一个承诺,因此可能会抛出错误。干杯!

【讨论】:

【参考方案3】:

Suvethan's answer 是正确的,但是迁移代码 sn -p 有一个小错误。 Sequelize 迁移期望返回一个承诺,这在生成的迁移框架中的注释中注明:

Add altering commands here.
Return a promise to correctly handle asynchronicity.

Example:
return queryInterface.createTable('users',  id: Sequelize.INTEGER );

因此,返回一组 Promise 可能会导致意外结果,因为无法保证所有 Promise 都会在继续下一次迁移之前得到解决。对于大多数操作,您不太可能遇到任何问题,因为大多数事情都会在 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
  
;

【讨论】:

"Promise.all" 在我的情况下丢失并引发异常。谢谢 我建议使用事务来对addColumn 进行分组,因此如果其中一个失败,所有都可以优雅地回滚,目前在文档中进行了演示:sequelize.org/v5/manual/migrations.html【参考方案4】:

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

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 现有模型中添加列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 Sequelize 更改列或添加新列时更新迁移文件

如何在sequelize中对嵌套模型中的列进行排序?

解决如何在现有表中添加列

node-sequelize学习笔记二(创建删除表安全检查表表列的数据类型)

如何在 Sequelize 模型中定义索引?

关联类方法中的现有字段 sequelize