首页 > 解决方案 > MySQL 视图将 INT 列的 SUM 转换为十进制类型

问题描述

我有一个这样的 MySQL 视图:

VIEW `qty_sold_view` AS
    SELECT 
        `t2`.`upc` AS `upc`, SUM(`t2`.`qty`) AS `qty_sold`
    FROM
        (`inventory_orders` `t1`
        JOIN `inventory_sales` `t2` ON ((`t2`.`order_id` = `t1`.`id`)))
    WHERE
        (`t1`.`date_placed` > (CURDATE() - INTERVAL 42 DAY))
    GROUP BY `t2`.`upc`

我使用 Django 原始查询对此视图运行查询:

sql = 'SELECT `upc`, `qty_sold` FROM `qty_sold_view` WHERE `upc` = 1001 OR `upc`= 1002 ...'
with connection.cursor() as con:
    con.execute(sql) 

inventory_orders请注意,我对表格和表格都有一个 Django 模型inventory_sales,但没有视图本身。

此查询的结果如下所示:

((1001, Decimal('1')), (1002, Decimal('4')), ...)

qtycolumn 和upccolumninventory_sales都是 INT 类型,所以我不明白为什么数据返回为Decimal.

问题是,当我尝试查看json.dumps此查询的结果时,我得到了这个:

TypeError:Decimal 类型的对象不是 JSON 可序列化的

我可以使用我在网上找到的各种答案来解决这个问题,以实际 json 序列化小数,但是当它们首先不应该是小数时这样做似乎很愚蠢。

我能做些什么来强制 MySQL 将它们视为 INT?

标签: mysqlsqldjangodjango-models

解决方案


据此,您在使用该功能时总是应该使用。FORMATSUM

将视图更改为:

VIEW `qty_sold_view` AS
SELECT 
    `t2`.`upc` AS `upc`, FORMAT(SUM(`t2`.`qty`), 0) AS `qty_sold`
FROM
    (`inventory_orders` `t1`
    JOIN `inventory_sales` `t2` ON ((`t2`.`order_id` = `t1`.`id`)))
WHERE
    (`t1`.`date_placed` > (CURDATE() - INTERVAL 42 DAY))
GROUP BY `t2`.`upc`

为我修好了。


推荐阅读