为什么我的续集查询将以字符串形式返回的十进制列求和

时间:2018-07-04 02:39:03

标签: javascript node.js sequelize.js

我正在汇总一个十进制列,它以字符串而不是整数形式返回?

exports.sumMoney = function (id) {
    return myModel.findAll({
        raw: true,
        attributes: [[sequelize.fn('SUM', sequelize.col('moneycol')), 'moneylabel']],
        where: { id: id }
    }).then(r => r);
}

4 个答案:

答案 0 :(得分:1)

我不确定您是使用MySQL还是Postgres,但是将其添加到配置中可以解决我在MySQL上的问题

dialectOptions: {
    decimalNumbers: true
}

答案 1 :(得分:0)

为了将结果转换为数字,您需要使用sequelize.cast函数执行显式转换:

exports.sumMoney = function (id) {
    return myModel.findAll({
        raw: true,
        attributes: [[sequelize.cast(sequelize.fn('SUM', sequelize.col('moneycol')), 'int'), 'moneylabel']],
        where: { id: id }
    }).then(r => r);
}

我不知道为什么在续集v4文档中未作说明,但v3指出:

  

在postgres上需要显式强制转换。

http://sequelize.readthedocs.io/en/v3/api/sequelize/#fnfn-args-sequelizefn

答案 2 :(得分:0)

几天前,我确实解决了该问题。 只有您需要使用SIGNED而不是int

[Transacciones.sequelize.cast(Transacciones.sequelize.fn('SUM', Transacciones.sequelize.col('fare')), 'SIGNED'), 'fare'],

答案 3 :(得分:0)

我找到了两种解决方法

  1. 通过在模型中传递get()方法

    discountPercentage: {
     type: DataTypes.DECIMAL(18, 3),
     allowNull: true,
     defaultValue: 0.000,
     get() {
       return parseFloat(this.getDataValue('discountPercentage')) || null;
     }
    },
    
  2. 通过设置 dialectOptions 与 ow3n 的答案相同(我已尝试使用 MySQL)

    new Sequelize('mysql://root@localhost:3306/database',{ 
      dialectOptions: 
       { 
         decimalNumbers: true 
       }
    })