首页 > 解决方案 > 列“”的 Sequelize 迁移默认值无法自动转换为“枚举”类型

问题描述

我正在尝试编写迁移以向我的 psql 数据库中的枚举添加/删除值,如下所示:

up : async (queryInterface, Sequelize) => {
  await queryInterface.changeColumn('Messages', 'status', {
    type : Sequelize.STRING
  });

  await queryInterface.sequelize.query('DROP TYPE IF EXISTS "enum_Messages_status"');

  await queryInterface.changeColumn('Messages', 'status', {
    type         : Sequelize.ENUM('unread', 'opened', 'expired', 'blocked', 'refused'),
    defaultValue : 'unread'
  });
},

down : async (queryInterface, Sequelize) => {
  await queryInterface.changeColumn('Messages', 'status', {
    type : Sequelize.STRING
  });

  await queryInterface.sequelize.query('DROP TYPE IF EXISTS "enum_Messages_status"');

  await queryInterface.changeColumn('Messages', 'status', {
    type         : Sequelize.ENUM('unread', 'opened', 'expired', 'blocked'),
    defaultValue : 'unread'
  });
}

不幸的是,该down方法返回:ERROR: default for column "status" cannot be cast automatically to type "enum_Messages_status".

如果我尝试将其更改down为:

await queryInterface.changeColumn('Messages', 'status', {
  type   : 'ENUM USING CAST("status" as ENUM)',
  values : [
    'unread',
    'opened',
    'expired',
    'blocked'
  ],
  defaultValue : 'unread'
});

我得到另一个错误:ERROR: type "enum" does not exist

我可以在这里做什么?谢谢!

标签: sqlmigrationsequelize.jspsql

解决方案


看来您不能在同一命令中强制转换和定义枚举。此外,您的演员阵容需要符合您的特定类型。

您可以做的是将枚举定义和列更改拆分为两个命令:

// Manually define the new type
await queryInterface.sequelize.query(`CREATE TYPE "enum_Messages_status" AS ENUM('unread', 'opened', 'expired', 'blocked')`);

// Use it to perform the cast
await queryInterface.changeColumn('Messages', 'status', {
  type: `"enum_Messages_status" USING CAST("status" as "enum_Messages_status")`,
});

对于相反的迁移,您需要颠倒顺序并删除类型。


推荐阅读