Ошибка миграции Postgres - ошибка: тип уже существует

exports.up = async (knex) => {
  await knex.raw(`
    ALTER TABLE accounts.login RENAME COLUMN type TO old_type;
    CREATE TYPE newest_login_type AS ENUM('hidden', 'github', 'twitter', 'google');
    ALTER TABLE accounts.login ADD COLUMN type newest_login_type;
  `);

  const types = await knex('accounts.login').select('old_type', 'user_id');

  await Promise.all(types.map(async ({ user_id, old_type }) => {
    return knex('accounts.login').where('user_id', user_id).update({ type: old_type });
  }));

  await knex.raw(`
    ALTER TABLE accounts.login DROP COLUMN old_type;
  `);
};

exports.down = async (knex) => {
  await knex.raw(`
    ALTER TYPE newest_login_type RENAME TO old_login_type;
    CREATE TYPE newest_login_type AS ENUM('hidden', 'github', 'twitter');
    ALTER TABLE accounts.login ALTER COLUMN type TYPE newest_login_type USING type::text::newest_login_type;
    DROP TYPE old_login_type;
  `);
};

Когда я migrate работает, то rollback работает, то migrate снова выдает следующую ошибку:

error: type "newest_login_type" already exists

Что я здесь делаю неправильно? Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 715
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я удивлен, как этот код вообще может работать, но ваша проблема в том, что скрипт up ожидает, что newest_login_type не существует, а ваш скрипт down не удаляет этот тип, а только переименовывает и воссоздает его.

Так:

  1. подбегая, newest_login_type создается
  2. бег вниз newest_login_type изменен
  3. снова подбежать не получается, потому что newest_login_type уже существуют

пс. Это вообще не должно работать, потому что вы не должны передавать несколько операторов SQL в один вызов knex.raw. Это просто не поддерживается многими драйверами БД, включая драйвер pg, который используется с диалектом knex postgresql.

Несколько операторов в одном вызове knex.raw присутствуют во всем нашем коде миграции, так что это определенно работает :)

Zack Shapiro 06.06.2019 19:02

Интересно. Какие версии knex/pg вы используете? Вы установили для него какие-то специальные параметры подключения? (Я был сопровождающим knex много лет, и я уверен, что это не всегда было возможно)

Mikael Lepistö 06.06.2019 19:04

Я могу копаться в этом позже, чтобы узнать. Я не знаю навскидку. Я исправил свою проблему, мой down должен был создать тип для перечисления, эквивалентный типу статус-кво. Up может создать новый. Спасибо, Микаэль.

Zack Shapiro 06.06.2019 19:06

Нашел :) github.com/brianc/node-postgres/issues/1190 (работает, пока не используются привязки параметров... как и в mysql тоже можно)

Mikael Lepistö 06.06.2019 19:07

Другие вопросы по теме