Des*_*ova 5 python postgresql sqlalchemy
我正在尝试将此 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"))
Run Code Online (Sandbox Code Playgroud)
如您所见,它使用子查询,最重要的是,子查询之一是相关查询(它使用d在外部查询中定义的表)。
我知道如何将子查询与subquery()函数一起使用,但我找不到有关 SQLAlchemy 相关查询的文档。你知道一种方法吗?
我们可以。
看一下下面的示例(尤其是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)
Run Code Online (Sandbox Code Playgroud)
将导致以下查询
SELECT table1.col, (SELECT if(table1.col = :col_1, table2.col, NULL) AS if_1
FROM table2) AS subquery
FROM table1
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果您调用correlatea select,则给定的内容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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4107 次 |
| 最近记录: |