我们可以用SQLAlchemy进行相关查询吗

2024-05-08 22:34:15 发布

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

我正在尝试将此SQL查询转换为Flask SQLAlchemy调用:

SELECT *
FROM "ENVOI"
WHERE "ID_ENVOI" IN (SELECT d."ID_ENVOI"
                     FROM "DECLANCHEMENT" d
                     WHERE d."STATUS" = 0
                                    AND d."DATE" = (SELECT max("DECLANCHEMENT"."DATE")
                                    FROM "DECLANCHEMENT"
                                    WHERE "DECLANCHEMENT"."ID_ENVOI" = d."ID_ENVOI"))

如您所见,它使用子查询,最重要的是,其中一个子查询是相关查询(它使用在外部查询中定义的d表)。在

我知道如何将子查询与subquery()函数一起使用,但是我找不到与SQLAlchemy相关联的查询的文档。你知道怎么做吗?在


Tags: andinfromidflasksqldate定义
2条回答

是的,我们可以。在

请看下面的示例(尤其是correlate方法调用):

from sqlalchemy import select, func, table, Column, Integer

table1 = table('table1', Column('col', Integer))
table2 = table('table2', Column('col', Integer))


subquery = select(
    [func.if_(table1.c.col == 1, table2.c.col, None)]
).correlate(table1)

query = (
    select([table1.c.col,
            subquery.label('subquery')])
    .select_from(table1)
)

if __name__ == '__main__':
    print(query)

将导致以下查询

^{pr2}$

如您所见,如果您对select调用correlate,则给定的Table将不会添加到它的FROM-子句中。 即使直接指定select_from,也必须这样做,因为SQLAlchemy很乐意在列中添加它找到的任何表。在

根据univerio评论的链接,我为我的请求编写了以下代码:

Declch = db.aliased(Declanchement)

maxdate_sub = db.select([db.func.max(Declanchement.date)])\
                .where(Declanchement.id_envoi == Declch.id_envoi)

decs_sub = db.session.query(Declch.id_envoi)\
            .filter(Declch.status == SMS_EN_ATTENTE)\
            .filter(Declch.date < since)\
            .filter(Declch.date == maxdate_sub).subquery()

envs = Envoi.query.filter(Envoi.id_envoi.in_(decs_sub)).all()

相关问题 更多 >

    热门问题