sqlalchemy的關聯子查詢

2021-07-05 10:44:49 字數 1670 閱讀 1190

sqlalchemy也算是用過好幾年了,不過一直都用著其中相對簡單的一小部分,最近寫個程式碰到個問題,需要作乙個關聯子查詢,類似這樣的sql語句:

select master.*, (

select count(*)

from detail

where detail.parentid=master.id and detail.someflag is not null

) from master;

試了很久不知道怎麼用orm來寫。

如果count不為0,用下面這個查詢的結果是一樣的:

select master.id, count(detail.id) 

from master

inner join detail on detail.parentid=master.id

where detail.someflag is not null

group by master.id;

這個語句倒是可以用orm實現:

qry = orm.query(master, func.count(detail.id).join(detail, 

detail.parentid==master.id).filter(detail.someflag!=none).group_by(master)

但是如果count為0就不行了,即便用outer join也不行,這種情況下會丟失count為0的master記錄。

想來想去大概只能用子查詢實現,但是試了這樣的語句,結果跟上面乙個是一樣的,也會丟失count為0的master記錄。

subqry = orm.query(detail.parentid, func.count(detail.id).label(

"flagcnt").filter(detail.someflag!=none).group_by(detail.parentid).subquery()

qry = orm.query(master, subqry.c.flagcnt).join(subqry, subqry.c.parentid==master.id)

這句的sql相當於這樣:

select master.id, subqry.flagcnt 

from master

join (

select detail.parentid, count(*) as flagcnt

from detail

where detail.someflag is not null

group by detail.parentid

) as subqry on subqry.parentid=master.id

subqry = orm.query(func.count(detail.id).label("flagcnt")).filter(

detail.parentid==master.id).filter(detail.someflag!=none).correlate(master).as_scalar()

qry = orm.query(master, subqry)

其中的重點就在於correlate和as_scalar。

SQLAlchemy 關聯表刪除實驗

本實驗所用 於官網文件 from sqlalchemy import table,column,integer,string,foreignkey from sqlalchemy.orm import relationship,backref from sqlalchemy.ext.declarat...

SQLAlchemy 使用 二 表關聯

在上一章中我們介紹了 sqlalchemy 建立基本表,但是一般情況下,表之間是有關聯的,比如 一對一 一對多 多對多,當然 sqlalchemy 是支援建立model時指定關係的 我們建立兩個表,vip和vip info,邏輯應該是一對一,我們先測試一對多 class vip base vip使用...

SQLAlchemy 關聯表刪除實驗

本實驗所用 於官網文件 from sqlalchemy import table,column,integer,string,foreignkey from sqlalchemy.orm import relationship,backref from sqlalchemy.ext.declarat...