【问题标题】:How to add column in Sequelize existing model?如何在 Sequelize 现有模型中添加列?
【发布时间】: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 文件!请检查
  • 检查答案,如果您有困难,请告诉我

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


【解决方案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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-01
        • 2015-12-25
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 2021-08-02
        • 1970-01-01
        相关资源
        最近更新 更多