gpt4 book ai didi

javascript - Postgres 迁移错误 - 错误 : type already exists

转载 作者:行者123 更新时间:2023-12-02 23:31:27 26 4
gpt4 key购买 nike

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;
`);
};

当我迁移时,它起作用,然后回滚起作用,然后迁移再次抛出以下错误:

error: type "newest_login_type" already exists

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

最佳答案

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

所以:

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

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

关于javascript - Postgres 迁移错误 - 错误 : type already exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com