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.

Я нашел аналогичный вопрос по адресу Как я могу запретить 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