如何在Sequelize CLI中添加,删除新列

Gij*_*ese 31 node.js sequelize.js psql sequelize-cli

我刚刚开始使用Sequelize和Sequelize CLI

由于这是一个开发时间,因此经常添加和删除列.将新列添加到现有模型的最佳方法是什么?

例如,我想要一个新的专栏' 完成 '到Todo模型.我将此列添加到models/todo.js.什么是下一步?

我试过了 sequelize db:migrate

不工作:"没有执行迁移,数据库架构已经是最新的."

Mar*_*ari 54

如果您使用的是sequelize-cli,则需要先创建迁移.这只是一个文件,告诉引擎如何更新数据库以及如何在出现问题时回滚更改.您应该始终将此文件提交到您的存储库

$ sequelize migration:create --name name_of_your_migration
Run Code Online (Sandbox Code Playgroud)

迁移文件如下所示:

module.exports = {
  up: function(queryInterface, Sequelize) {
    // logic for transforming into the new state
    return queryInterface.addColumn(
      'Todo',
      'completed',
     Sequelize.BOOLEAN
    );

  },

  down: function(queryInterface, Sequelize) {
    // logic for reverting the changes
    return queryInterface.removeColumn(
      'Todo',
      'completed'
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,运行它:

$ sequelize db:migrate
Run Code Online (Sandbox Code Playgroud)

  • 有这方面的文档吗? (3认同)
  • 另外我应该更喜欢哪些文档?http://docs.sequelizejs.com 或 http://sequelize.readthedocs.io ? (2认同)

the*_*tto 21

如果要将多个列添加到同一表中,Promise.all()请将所有内容包装在中,然后将要添加的列放入数组中:

module.exports = {
  up: (queryInterface, Sequelize) => {
    return Promise.all([
      queryInterface.addColumn(
        'tableName',
        'columnName1',
        {
          type: Sequelize.STRING
        }
      ),
      queryInterface.addColumn(
        'tableName',
        'columnName2',
        {
          type: Sequelize.STRING
        }
      ),
    ]);
  },

  down: (queryInterface, Sequelize) => {
    return Promise.all([
      queryInterface.removeColumn('tableName', 'columnName1'),
      queryInterface.removeColumn('tableName', 'columnName2')
    ]);
  }
};

Run Code Online (Sandbox Code Playgroud)

sequelize https://sequelize.readthedocs.io/en/2.0/api/datatypes/可以支持任何列类型

  • 此外,最好使用事务来包装承诺。您可以在这里找到一个示例:http://docs.sequelizejs.com/manual/migrations.html#migration-sculpture (2认同)

小智 10

您仍然可以使用同步函数,该函数采用带有两个选项的对象参数,当然一个是不添加值的默认选项,另一个是添加强制或更改属性的实例。因此,在这种情况下,您要使用UserModel.sync({ force: true }):这将创建表,如果它已经存在,则首先删除它

UserModel.sync({ alter: true })
Run Code Online (Sandbox Code Playgroud)

这会检查数据库中表的当前状态(它有哪些列,它们的数据类型是什么等),然后在表中执行必要的更改以使其与模式匹配...您可以使用这个当您使用模型实例时有关更新以及表和模型的更多信息请查看此处有关更多功能的文档


Gav*_*son 8

在 sequelize 中添加多列

第 1 步:生成空迁移

sequelize migration:generate --name custom_name_describing_your_migration

第 2 步:将列添加到空迁移

根据文档https://sequelize.org/master/manual/migrations.html#migration-skeleton使用事务:

module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.sequelize.transaction((t) => {
            return Promise.all([
                queryInterface.addColumn('table_name', 'field_one_name', {
                    type: Sequelize.STRING
                }, { transaction: t }),
                queryInterface.addColumn('table_name', 'field_two_name', {
                    type: Sequelize.STRING,
                }, { transaction: t })
            ])
        })
    },

    down: (queryInterface, Sequelize) => {
        return queryInterface.sequelize.transaction((t) => {
            return Promise.all([
                queryInterface.removeColumn('table_name', 'field_one_name', { transaction: t }),
                queryInterface.removeColumn('table_name', 'field_two_name', { transaction: t })
            ])
        })
    }
};
Run Code Online (Sandbox Code Playgroud)

第 3 步:运行迁移

sequelize db:migrate


小智 7

如果你在 vscode 中工作,你可以在迁移文件中添加类型定义。这有助于识别 QueryInterface 和 sequelize 提供的所有方法。

 module.exports = {
/**
   * @typedef {import('sequelize').Sequelize} Sequelize
   * @typedef {import('sequelize').QueryInterface} QueryInterface
   */

  /**
   * @param {QueryInterface} queryInterface
   * @param {Sequelize} Sequelize
   * @returns
   */
  up: function(queryInterface, Sequelize) {
    // logic for transforming into the new state
    return queryInterface.addColumn(
      'Todo',
      'completed',
     Sequelize.BOOLEAN
    );

  },

  down: function(queryInterface, Sequelize) {
    // logic for reverting the changes
    return queryInterface.removeColumn(
      'Todo',
      'completed'
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

这将提供如下智能感知 续集智能感知