在sqlachemy中的having子句中使用标签

2024-10-02 16:24:00 发布

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

我试图在sqlalchemy的having子句中使用一个标签,但是在让它工作时遇到问题。我在尝试这样的事情:

qry = db.session.query(
         Foo.id,
         Foo.name,
         (Foo.max_stuff - func.sum(Bar.stuff)).label('rstuff')
).join(Bar) \
 .group_by(Foo.id) \
 .having('rstuff' >= "some_data_passed_in_by_customer")

for res in qry.all(): 
    print res

但得到的错误是:

^{pr2}$

如果我尝试将having语句更改为:

.having('rstuff >= "some_data_passed_in_by_customer"')

然后它似乎可以正常工作,但我猜这会导致sql注入漏洞。我可以通过原始sql来实现这一点,但如果可以的话,我希望避免这种情况。有什么想法吗?在


Tags: inidsqldatabyfoobarres
1条回答
网友
1楼 · 发布于 2024-10-02 16:24:00

请尝试以下两个版本中的任何一个(但不确定第二个版本是否适用于MySQL):

rstuff = (Foo.max_stuff - db.func.sum(Bar.stuff))
qry = (
    db.session.query(
        Foo.id,
        Foo.name,
        rstuff.label('rstuff')
    )
    .join(Bar)
    .group_by(Foo.id)

    # version-1: probably universal, but repeats the expression
    .having(rstuff >= 3)
    # version-2: might depend on the RMDBS engine
    # .having(db.literal_column('rstuff') >= 3)
)

相关问题 更多 >