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...