Postgres迁移错误-错误:类型已存在

时间:2019-06-06 15:25:14

标签: javascript postgresql knex.js

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再次抛出以下错误:

  

错误:类型“ newest_login_type”已经存在

我在这里做错了什么?谢谢

1 个答案:

答案 0 :(得分:1)

我很惊讶该代码如何工作,但是您的问题是up脚本期望newest_login_type不存在,并且您的down脚本不会删除该类型,而只会重命名和重新创建它。

所以:

  1. 正在运行,newest_login_type已创建
  2. 运行newest_login_type的操作已修改
  3. 再次运行失败,因为newest_login_type已经存在

ps。这根本不起作用,因为您不应将多个SQL语句传递给单个knex.raw调用。只是许多数据库驱动程序不支持该功能,包括与knex的Postgresql方言一起使用的pg驱动程序。