sql - 列“”的 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
。
我可以在这里做什么?谢谢!
解决方案
看来您不能在同一命令中强制转换和定义枚举。此外,您的演员阵容需要符合您的特定类型。
您可以做的是将枚举定义和列更改拆分为两个命令:
// 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")`,
});
对于相反的迁移,您需要颠倒顺序并删除类型。
推荐阅读
- java - 如何使用 apache poi 获取子形状的绝对位置
- android - 读取 QR 码会导致 kotlin 应用程序崩溃
- java - 如何在没有 GUI 的情况下运行 Java(isHeadless 为真)?
- linux - 在 Ubuntu 16.04 上使用 Intel MKL BLAS LAPACK 编译“binica”
- batch-file - 如果尚未安装,如何使用批处理脚本安装 kb* Windows 更新?
- json - 使用标识符将 JSON 拆分为两个不同的对象
- ios - 为什么 iOS 中的振动持续时间不可配置(React Native)?
- javascript - 在 Webpack 4 构建之后在 .js 中保留一个变量名
- javascript - 推送路线时将对象作为道具传递
- python - 从线程池中依次并行执行10个线程