javascript - 当我撤消迁移 sequelize 删除我的表或重命名为 table_backup

标签 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');
        });
      });
  },
};

最佳答案

您没有在 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');
        });
      });
  },

有关 Sequelize 迁移的更多信息,请参阅此处的 docs 或此 amazing blog post

关于javascript - 当我撤消迁移 sequelize 删除我的表或重命名为 table_backup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53867226/

相关文章:

Javascript 错误 - 左位移返回错误的输出

node.js - 在 Node 运行时 10 上部署 Firebase Cloud Functions 时出错,但在 Node 运行时 8 上工作

javascript - 使用 multer 在 express js 上上传多个文件返回空数组

javascript - setTimeout函数和异步函数

java - 找不到更新日志 changelog.groovy

javascript - 某些 JavaScript 函数在 Chrome 浏览器上不起作用,为什么?

javascript - 防止页面在后退按钮上重新加载(使用缓存)。或者向下滚动用户。 (问题,至少,iPhone)

javascript - 为什么上个月的 12.31.2013 是 12.01.2013?

ruby-on-rails - 如何在Rails中建立多对多关系

c++ - 将项目从 **VS 2012** 迁移到 **VS2013** 后 Dll Register 问题