SQLAlchemy无缘无故地将“= 1”添加到子查询的末尾

时间:2015-02-23 08:58:44

标签: python mysql sqlalchemy

我正在尝试运行子查询,然后根据与该子查询的匹配进行更新。一切都可以正常输出SQL,除了SQLAlchemy在我的子查询的末尾添加“= 1”似乎无缘无故,这使得更新达到了0行。这是代码:

to_update = session.query(DSI.id)\
    .join(TB)\
    .join(TBC)\
    .join(TBCTD)\
    .filter(func.DATE(TBCTD.dt)
            == func.subdate(func.current_date(), 2))\
    .filter(DSI.score > 110)\
    .group_by(func.DATE(TBCTD.dt),
              DSI.name, DSI.a_id)\
    .having(func.sum(
        TBCTD.num_things
        > 100)).subquery()
session.query(DSI).filter(DSI.id == to_update.c.id)\
   .update({"some_num": DSI.some_num*.98})

MYSQL吐出来的样子如下:

UPDATE dsis, (SELECT dsis.id AS id
FROM dsis 
INNER JOIN tbs ON tbs.id = dsis.a_id 
INNER JOIN tbcs ON tbs.id = tbcs.a_id 
INNER JOIN tbctds ON tbcs.id = tbctds.tbcs_id
WHERE DATE(tbctds.dt) = subdate(CURRENT_DATE, %s) 
AND dsis.score > %s 
GROUP BY DATE(tbctds.dt), dsis.name, dsis.a_id
HAVING sum(tbctds.num_things > %s) = 1) 
AS anon_1 
SET dsis.some_num=(dsis.some_num * %s) 
WHERE dsis.id = anon_1.id
2015-02-20 21:11:53,164 INFO sqlalchemy.engine.base.Engine (2, 110, 100, 0.98)

正如你所看到的,一个额外的“= 1”被添加到子查询的末尾,完全没有理由,我不知道。我试过用一些方法重写声明,总是遇到同样的问题。

1 个答案:

答案 0 :(得分:0)

你应该写

having(func.sum(TBCTD.num_things) > 100)

测试sum()大于100.而不是你写的

having(func.sum(TBCTD.num_things > 100))

这将使布尔值(而TINYINT(1))相加。

有趣的是,整数为-1,false为0;所以你会以非正整数结束); SQLAlchemy知道它需要having的布尔值,所以它试图通过将它与1进行比较来测试它的真实性;毕竟,TINYINT(1)的值-1在MySQL中等于1,因为1作为常量被强制转换为TINYINT(1)的范围。

但是在你的情况下,HAVING子句永远不会为真,因为结果不是布尔值,也是非正数。