Python SQLAlchemy:在union_的子查询上加上前缀的列名,共有3个表
这是我的mssql代码片段Python SQLAlchemy:在union_的子查询上加上前缀的列名,共有3个表,python,sql,sqlalchemy,flask-sqlalchemy,Python,Sql,Sqlalchemy,Flask Sqlalchemy,这是我的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_s
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”查询中标记列名
重复第1步和第2步,效果很好
现在我的问题是
我想用第三个查询“z”对所有“u1”进行联合,我已经在“z”中标记了列名
我会这样做,使所有的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']
如何避免列名的前缀
我通过了考试
我发现了一个类似的问题
我不知道有什么方法可以阻止前缀,但是您可以将子查询的
c
属性转换为列表或元组,然后按位置访问各个列。下面是一个使用元组解包的示例:
>>> inc_type_md_col, cnt_col, ctr_dt_col = tuple(subq_xyz.c)
inc\u type\u md\u col
、cnt\u col
和ctr\u dt\u col
都是有效的列对象,您可以对它们执行任何操作,例如
>>> session.query(inc_type_md_col).filter(cnt_col > 0)
我讨厌这样解决了我的问题,因为我觉得我做了错事,但它确实做了。(谢谢!)我只是忍不住想知道是否还有更规范的东西。
>>> inc_type_md_col, cnt_col, ctr_dt_col = tuple(subq_xyz.c)
>>> session.query(inc_type_md_col).filter(cnt_col > 0)