使用SQLAlchemy在子句中使用子查询生成sql作为一列 [英] Generate sql with subquery as a column in select statement using SQLAlchemy

查看:420
本文介绍了使用SQLAlchemy在子句中使用子查询生成sql作为一列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法可以使SQLAlchemy生成带有自定义列的查询,该自定义列是与当前行相关的子查询:

Is there a way to make SQLAlchemy generate a query with a custom column that is a subquery that correlates with current row:

SELECT
 tab1.id,
 tab1.col1, 
 ...,
 (
     SELECT count(1) FROM tab2 
     WHERE tab2.tab1_id = tab1.id
     GROUP BY tab2.col1
 ) as cnt
FROM tab1
WHERE ...
LIMIT 100

使用ORM API?

session.query(Tab1, ?(subquery for additional column)?).filter(...).limit(100)

我使用的是PostgreSQL 9.3和旧版本的SQLAlchemy 0.9.8

I'm using PostgreSQL 9.3 and old version of SQLAlchemy 0.9.8

推荐答案

如果您经常需要这样做,并且/或计数是您的 Tab1 模型的组成部分,您应该使用混合属性,如其他答案中所述。另一方面,如果只需要一个查询就可以使用它,那么您可以使用 Query.label() Query.as_scalar()

If you need this often, and/or the count is an integral part of your Tab1 model, you should use a hybrid property such as described in the other answer. If on the other hand you need this just for a single query, then you could just create the scalar subquery using Query.label(), or Query.as_scalar():

count_stmt = session.query(func.count(1)).\
    filter(Tab2.tab1_id == Tab1.id).\
    group_by(Tab2.col1).\
    label('cnt')

session.query(Tab1, count_stmt).filter(...).limit(100)

子查询将自动关联包含在封闭查询中的内容。

The subquery will automatically correlate what it can from the enclosing query.

这篇关于使用SQLAlchemy在子句中使用子查询生成sql作为一列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆