簡體   English   中英

SQLAlchemy:以3個表的union_all子查詢為前綴的列名

[英]SQLAlchemy : column name prefixed on the subquery of union_all of 3 tables

這是我的mssql代碼片段

cnt = func.count(pvr_svc.ic_idn).label('cnt')

x = session.query(pvr_svc.inc_type_md, cnt, cast(pvr_svc.crt_dt,DATE)
         .label('crt_dt'))
         .filter(pvr_svc.inc_type_md.in_(['PM','OM','OP-HU']))
         .group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)

y = session.query(pvr_svc.inc_type_md, cnt, cast(pvr_svc.crt_dt,DATE)
         .label('crt_dt'))
         .filter(pvr_svc.gold_idn==2)
         .group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)

這就是我想要做的

from sqlalchemy import union_all

u1 = x.union_all(y)     # ----- 1

“u1”中的列名提取如下

 >>>[i['name'] for i in u1.column_descriptions]  

 >>>['inc_type_md', 'cnt', 'crt_dt']   # column names

現在如果我想在將來使用'u1'這就是我的工作

>>>v1 = u1.subquery()    #------ 2

要從“v1”訪問列名,我這樣做

>>>v1.c.keys()

>>>[u'pvr_svc_inc_type_md', u'cnt', u'crt_dt']

現在,如果你看到'u1'中的第一個鍵和'v1'(它是u1的子查詢)是不同的。 我期待它們是一樣的。

為了避免這種情況,我會在“x”和“y”查詢中標記列名

x = session.query(pvr_svc.inc_type_md.label('inc_type_md'), cnt, cast(pvr_svc.crt_dt,DATE).label('crt_dt')
         .label('crt_dt'))
         .filter(pvr_svc.inc_type_md.in_(['PM','OM','OP-HU']))
         .group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)

y = session.query(pvr_svc.inc_type_md.label('inc_type_md'), cnt, cast(pvr_svc.crt_dt,DATE).label('crt_dt')
         .label('crt_dt'))
         .filter(pvr_svc.gold_idn==2)
         .group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)

並重復步驟1和2,它工作正常。

現在我的問題是

我想用第三個查詢“z”做一個“u1”的union_all,我在“z”中標記了列名

z = session.query(pvr_svc.inc_type_md.label('inc_type_md'), cnt, cast(pvr_svc.crt_dt,DATE).label('crt_dt')
         .label('crt_dt'))
         .filter(pvr_svc.gold_idn==4)
         .group_by(cast(pvr_svc.crt_dt, DATE), pvr_svc.inc_type_md)

我會這樣做使3個查詢的union_all

>>>union_xyz = u1.union_all(z)

現在我想在將來的查詢中使用“union_xyz”,所以我創建了一個子查詢

>>>sub_xyz = union_xyz.subquery()

現在的問題是,sub_xyz中的列名前綴有一些整數

所以,這就是我得到的,

>>>sub_xyz.c.keys()
>>>[u'%(2911061292 anon)s_inc_type_md', u'%(2911061292 anon)s_cnt', u'%(2911061292 anon)s_crt_dt']

如何避免列名的前綴?

我瀏覽了sqlalchemy doc

我發現了一個類似的問題: 如何阻止sqlalchemy為CTE的列名添加前綴?

我不知道有什么方法可以阻止前綴,但您可以將子查詢的c屬性轉換為列表或元組,然后按位置訪問各列。 這里是一個使用元組解包的示例:

>>> inc_type_md_col, cnt_col, ctr_dt_col = tuple(subq_xyz.c)

inc_type_md_colcnt_colctr_dt_col是有效的列對象,你可以用它們做任何你喜歡的事情,例如

>>> session.query(inc_type_md_col).filter(cnt_col > 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM