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