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

2024-06-23 19:22:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试运行一个子查询,然后基于与该子查询的匹配进行更新。除了SQLAlchemy似乎无缘无故地将“=1”添加到子查询的末尾,这使得更新命中0行之外,输出SQL的一切都可以正常工作。代码如下:

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”,完全没有任何原因,我也不知道。我试过用几种方法重写这句话,结果总是出同样的问题


Tags: iddatedtupdatesomefilternumfunc
1条回答
网友
1楼 · 发布于 2024-06-23 19:22:58

你应该写信的

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

测试sum()是否大于100

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

它将布尔值求和(反过来是TINYINT(1)

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

然而,在您的例子中,HAVING子句可以从不为真,因为结果不是布尔值,也不是正的

相关问题 更多 >

    热门问题