这是我的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)
我要做的是
^{pr2}$“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”进行联合,我在“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_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
我发现了一个类似的问题 How can I prevent sqlalchemy from prefixing the column names of a CTE?
我不知道有什么方法可以防止使用前缀,但是可以将子查询的
c
属性转换为列表或元组,然后按位置访问各个列。下面是一个使用元组解包的示例:}都是有效的列对象,您可以对它们做任何您喜欢的事情,例如
^{pr2}$inc_type_md_col
,cnt_col
,和{相关问题 更多 >
编程相关推荐