如何在Sequelize模型中定义根据其他字段自动计算的生成列?
Sequelize模型配置MySQL条件生成列方案
你可以直接在Sequelize模型的PROFIT字段定义中通过内置属性配置生成列,无需手动执行SQL修改表结构,修改后的完整模型代码如下:
Gsdatatab.init({ SCRIP: { type: DataTypes.STRING, unique: true, }, LTP: DataTypes.FLOAT, OHL: DataTypes.STRING, ALERT: DataTypes.FLOAT, PROFIT: { type: DataTypes.FLOAT, // 指定生成列类型为VIRTUAL,可选值还有STORED(持久化存储到磁盘) generated: 'VIRTUAL', // 用sequelize.literal包裹原生SQL计算逻辑 defaultValue: sequelize.literal('(CASE WHEN `OHL` = "B" THEN `LTP` - `ALERT` WHEN `OHL` = "S" THEN `ALERT` - `LTP` END)') } }, { sequelize, modelName: 'Gsdatatab', timestamps: true, }); return Gsdatatab; };
低版本Sequelize兼容方案
如果你使用的Sequelize版本低于6.x,不支持generated属性,可以直接通过columnType属性声明完整的列定义:
PROFIT: { type: DataTypes.FLOAT, columnType: 'FLOAT GENERATED ALWAYS AS (CASE WHEN `OHL` = "B" THEN `LTP` - `ALERT` WHEN `OHL` = "S" THEN `ALERT` - `LTP` END) VIRTUAL' }
注意事项
- 生成列由MySQL自动维护,业务代码中插入、更新数据时不需要为PROFIT字段赋值,所有针对该字段的手动赋值都会被数据库自动忽略
- 调用
sync()方法同步表结构时,Sequelize会自动生成对应的表结构修改语句,无需手动执行SQL
内容的提问来源于stack exchange,提问作者Siba Swain
相关产品推荐
相关产品推荐

