SQLAlchemy: име на колона с префикс в подзаявката на union_all от 3 таблици

Ето моя кодов фрагмент на 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 и работи добре.

Сега проблемът ми е

Искам да направя union_all на "u1" с третата заявка "z", маркирал съм имената на колоните в "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)

Бих направил това, за да направя union_all от 3 заявки

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


person Ameet S M    schedule 16.10.2014    source източник


Отговори (1)


Не знам за някакъв начин за предотвратяване на префикса, но можете да преобразувате атрибута c на вашата подзаявка в списък или кортеж и след това да получите достъп до отделните колони по позиция. Ето един пример, който използва разопаковане на кортежи:

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

inc_type_md_col, cnt_col и ctr_dt_col тогава са валидни обекти на колони и можете да правите каквото искате с тях, напр.

>>> session.query(inc_type_md_col).filter(cnt_col > 0)
person Martin Wiebusch    schedule 27.01.2016
comment
Мразя, че това реши проблема ми, защото имам чувството, че правя нещо по грешен начин, но определено беше. (Благодаря!) Просто не мога да не се запитам дали има нещо по-канонично. - person Thomas Thorogood; 04.12.2019