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”已经存在
我在这里做错了什么?谢谢
答案 0 :(得分:1)
我很惊讶该代码如何工作,但是您的问题是up
脚本期望newest_login_type
不存在,并且您的down脚本不会删除该类型,而只会重命名和重新创建它。
所以:
newest_login_type
已创建newest_login_type
的操作已修改newest_login_type
已经存在 ps。这根本不起作用,因为您不应将多个SQL语句传递给单个knex.raw
调用。只是许多数据库驱动程序不支持该功能,包括与knex的Postgresql方言一起使用的pg
驱动程序。