Когда я отменяю миграцию, продолжайте удалять мою таблицу или переименовывайте в table_backup - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть несколько таблиц, одна из которых называется events table.Когда я запускаю миграцию, все выглядит нормально, но если я отменил последнюю миграцию, моя отмена миграции завершится безо всякой ошибки.Когда я проверяю свою базу данных, моя таблица была переименована в 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 голосов
/ 20 декабря 2018

Вы не возвращаете оператор Promise в then.events таблица временно переименовывается в 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');
        });
      });
  },

Для получения дополнительной информации о миграции сиквелизов см. документы здесь или в этом удивительном сообщении в блоге .

...