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

Javascript Postgres迁移错误-错误:类型已存在,javascript,postgresql,knex.js,Javascript,Postgresql,Knex.js,当Imigrate工作时,然后rollback工作,然后migrate再次抛出以下错误: 错误:类型“最新登录类型”已存在 我做错了什么?谢谢我对代码的工作方式感到惊讶,但您的问题是up脚本期望最新的登录类型不存在,并且您的down脚本不会删除该类型,而只是重命名并重新创建它 因此: 运行时,将创建最新的登录类型 正在运行的最新登录\u类型被修改 再次运行失败,因为最新的登录类型已经存在 另外,这根本不应该起作用,因为您不应该将多个SQL语句传递给单个knex.raw调用。许多DB驱动程序都不支

当I
migrate
工作时,然后
rollback
工作,然后
migrate
再次抛出以下错误:

错误:类型“最新登录类型”已存在


我做错了什么?谢谢

我对代码的工作方式感到惊讶,但您的问题是
up
脚本期望
最新的登录类型
不存在,并且您的down脚本不会删除该类型,而只是重命名并重新创建它

因此:

  • 运行时,将创建最新的登录类型
  • 正在运行的
    最新登录\u类型
    被修改
  • 再次运行失败,因为最新的登录类型已经存在

  • 另外,这根本不应该起作用,因为您不应该将多个SQL语句传递给单个
    knex.raw
    调用。许多DB驱动程序都不支持这一点,包括knex的postgresql方言使用的
    pg
    驱动程序。

    一个
    knex.raw
    调用中的多个语句都在我们的迁移代码中,所以它肯定能工作:)有趣。您使用的是哪种knex/pg版本?您是否为它设置了一些特殊的连接参数?(我作为knex的维护人员已经很多年了,我相信这并不总是可能的)我可以在以后深入研究这个问题来找出答案。我一点也不知道。我修复了我的问题,我的
    down
    需要为enum创建一个与status-quot类型等效的类型。Up可以创建一个新的。感谢MikaelFound:)(只要不使用参数绑定,就可以工作……就像mysql一样,也可以这样做)
    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;
      `);
    };