SequelizeDatabaseError: отбрасывание несуществующих типов ENUM, но они на самом деле существуют - PullRequest
0 голосов
/ 22 января 2019

Когда я пытаюсь отменить последующую миграцию в моей базе данных heroku-postgres, я получаю SequelizeDatabaseError, потому что типы ENUM предположительно не существуют.

У меня есть несколько таблиц / моделей с типами данных ENUM. В нисходящих миграциях я пытаюсь удалить таблицу, а затем также удалить связанные с ней типы данных enum. Пока что только одна миграция, кажется, правильно применяется в обоих направлениях.

Я пытался вручную отбросить каждый тип, а затем перенести все и отменить все, но он всегда дает сбой в одних и тех же моделях, говоря, что типы ENUM не существуют (когда они явно были созданы в восходящих миграциях).

Вот модель с неудачной миграцией.

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('PatientContacts', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      phoneHome: {
        type: Sequelize.STRING,
        allowNull: true,
      },
      phoneWork: {
        type: Sequelize.STRING,
        allowNull: true,
      },
      phoneMobile: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      phonePreferred: {
        type: Sequelize.ENUM,
        values: ['Home','Work','Mobile', null]
      },
      smsNotifications: {
        type: Sequelize.ENUM,
        values: [true, false, null]
      },
      email: {
        type: Sequelize.STRING,
        allowNull: true,
      },
      emailConsent: {
        type: Sequelize.ENUM,
        values: [true, false, null]
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('PatientContacts')
    .then(() => queryInterface.sequelize.query('DROP TYPE "public"."enum_PatientContacts_emailConsent;"'))
    .then(() => queryInterface.sequelize.query('DROP TYPE "public"."enum_PatientContacts_phonePreferred;"'))
    .then(() => queryInterface.sequelize.query('DROP TYPE "public"."enum_PatientContacts_smsNotifications;"'))
    .catch(err => {
      console.log(err);
      throw new Error(err);
    })
  }
};

Я ожидаю, что при миграции вниз будет выполняться необработанный запрос в обратных вызовах. Тем не менее, ошибка, как описано выше:

Error: SequelizeDatabaseError: type "public.enum_PatientContacts_emailConsent;" does not exist
at queryInterface.dropTable.then.then.then.catch.err (/app/migrations/20181213023202-create-PatientContact.js:56:13)
at tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/app/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/app/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/app/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/app/node_modules/bluebird/js/release/promise.js:690:18)
at _drainQueueStep (/app/node_modules/bluebird/js/release/async.js:138:12)
at _drainQueue (/app/node_modules/bluebird/js/release/async.js:131:9)
at Async._drainQueues (/app/node_modules/bluebird/js/release/async.js:147:5)
at Immediate.Async.drainQueues [as _onImmediate] (/app/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:693:18)
at tryOnImmediate (timers.js:664:5)
at processImmediate (timers.js:646:5)

Я должен упомянуть, что добавление имени типа к "public" было только моей последней попыткой. Удаление также дает тот же результат.

1 Ответ

0 голосов
/ 22 января 2019

Я очень разочарован тем, что застрял на этой проблеме в течение нескольких часов.

Точка с запятой для завершения необработанного запроса должна была идти после двойной кавычки, заканчивающейся именем типа, но перед одиночнойкавычка, заканчивающая весь запрос sql.

...