当我撤消迁移后,删除我的表或重命名为table_backup

时间:2018-12-20 10:52:07

标签: javascript node.js migration sequelize.js

我有一些表,其中之一称为events表。当我运行迁移时,一切看起来都很好,但是如果我撤消上一次迁移,我的撤消迁移将结束而不会出现任何错误。当我检查数据库时,我的表已重命名为event_backup,因此当我尝试进行迁移时,由于表event已重命名为event_backup和表event而出现错误不存在。

上次迁移文件:

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface
      .addColumn('temp', 'StudyId', {
        type: Sequelize.UUID,
        references: {
          model: 'studies',
          key: 'id',
        },
        onUpdate: 'CASCADE',
        onDelete: 'SET NULL',
      })
      .then(() => {
        return queryInterface.addColumn('temp', 'SubjectId', {
          type: Sequelize.UUID,
          references: {
            model: 'subjects',
            key: 'id',
          },
          onUpdate: 'CASCADE',
          onDelete: 'SET NULL',
        });
      })
      .then(() => {
        return queryInterface.addColumn('events', 'SubjectId', {
          type: Sequelize.UUID,
          references: {
            model: 'subjects',
            key: 'id',
          },
          onUpdate: 'CASCADE',
          onDelete: 'SET NULL',
        });
      })
      .then(() => {
        return queryInterface.addColumn('events', 'StudyId', {
          type: Sequelize.UUID,
          references: {
            model: 'studies',
            key: 'id',
          },
          onUpdate: 'CASCADE',
          onDelete: 'SET NULL',
        });
      });
  },

  down: queryInterface => {
    return queryInterface
      .removeColumn('temp', 'StudyId')
      .then(() => {
        queryInterface.removeColumn('temp', 'SubjectId');
      })
      .then(() => {
        queryInterface.removeColumn('events', 'SubjectId').then(() => {
          queryInterface.removeColumn('events', 'StudyId');
        });
      });
  },
};

1 个答案:

答案 0 :(得分:0)

您不会在Promise语句中返回thenevents表在迁移时被临时重命名为events_backup。迁移完成后,您将获得events表格,但是由于未返回Promise,因此您将无法完成迁移。

要解决undo迁移问题,请在每个return之前添加queryInterface.removeColumn关键字。

现在,当您开始进行undo迁移时,您的events表将被临时重命名为events_backup,然后又重新命名为events表。

查看工作示例。

  down: queryInterface => {
    return queryInterface
      .removeColumn('temp', 'StudyId')
      .then(() => {
        return queryInterface.removeColumn('temp', 'SubjectId');
      })
      .then(() => {
        queryInterface.removeColumn('events', 'SubjectId').then(() => {
          return queryInterface.removeColumn('events', 'StudyId');
        });
      });
  },

有关顺序迁移的更多信息,请参见此处的docs或此amazing blog post