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
Что я здесь делаю неправильно? Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я удивлен, как этот код вообще может работать, но ваша проблема в том, что скрипт up ожидает, что newest_login_type не существует, а ваш скрипт down не удаляет этот тип, а только переименовывает и воссоздает его.
Так:
newest_login_type создаетсяnewest_login_type измененnewest_login_type уже существуютпс. Это вообще не должно работать, потому что вы не должны передавать несколько операторов SQL в один вызов knex.raw. Это просто не поддерживается многими драйверами БД, включая драйвер pg, который используется с диалектом knex postgresql.
Интересно. Какие версии knex/pg вы используете? Вы установили для него какие-то специальные параметры подключения? (Я был сопровождающим knex много лет, и я уверен, что это не всегда было возможно)
Я могу копаться в этом позже, чтобы узнать. Я не знаю навскидку. Я исправил свою проблему, мой down должен был создать тип для перечисления, эквивалентный типу статус-кво. Up может создать новый. Спасибо, Микаэль.
Нашел :) github.com/brianc/node-postgres/issues/1190 (работает, пока не используются привязки параметров... как и в mysql тоже можно)
Несколько операторов в одном вызове
knex.rawприсутствуют во всем нашем коде миграции, так что это определенно работает :)