使用SQLAlchemy在子句中使用子查询生成sql作为一列 [英] Generate sql with subquery as a column in select statement using SQLAlchemy
问题描述
有没有一种方法可以使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屋!