Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:在union_的子查询上加上前缀的列名,共有3个表_Python_Sql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python SQLAlchemy:在union_的子查询上加上前缀的列名,共有3个表

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

这是我的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”查询中标记列名

重复第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)