gpt4 book ai didi

python - SQLAlchemy 无缘无故地将 "=1"添加到子查询的末尾

转载 作者:行者123 更新时间:2023-11-29 22:57:16 30 4
gpt4 key购买 nike

我正在尝试运行一个子查询,然后根据与该子查询的匹配进行更新。输出 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”,我也不知道。我尝试用几种方法重写该语句,但总是遇到同样的问题。

最佳答案

你应该写

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

它测试 sum() 是否大于 100。而不是你写的

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

它将 bool 值相加(依次为TINYINT(1)

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

但是,在您的情况下,HAVING 子句永远不可能为真,因为结果不是 bool 值,而且也不是正值。

关于python - SQLAlchemy 无缘无故地将 "=1"添加到子查询的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28669978/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com