强制mysqldb dict游标返回带有表名的所有列名前缀

时间:2011-07-25 20:05:55

标签: python mysql select mysql-python

SELECT * FROM a, b WHERE ...

Mysql允许在查询结果中使用重复的列名。因此,在终端中,没有一个列名使用上述查询作为前缀。

但是,我在python中使用了mysqldb和DictCursor。结果是列表名称为键的字典列表。有时,dict游标会自动在列名前加上表名。据我所知,它是针对两个不明确的列名称中的第二个,但仅当第二个值是唯一的时才这样做。无论如何,我想强制光标使用表名为所有键添加前缀。

来自fetch.row()函数的mysqldb docs ...

  

第二个参数(how)告诉它应该如何表示行。   默认情况下,它为零,表示作为元组返回。 how = 1表示,   将它作为字典返回,其中键是列名,或   table.column如果有两个具有相同名称的列(例如,来自a   加入)。 how = 2表示与how = 1相同,只是键总是如此   TABLE.COLUMN;这是为了与旧的Mysqldb模块兼容。

所以,它似乎可行,但我没有直接使用fetch.row()函数...所以问题是,如何才能使mysqldb dict游标始终使用how = 2获取行?

2 个答案:

答案 0 :(得分:2)

我不是在查询中使用*的忠实粉丝。列出您的列并根据需要分配您自己的别名。正如你所看到的,我也不是隐式连接的粉丝。

SELECT a.col1 AS acol1,
       a.col2 AS acol2,
       b.col1 AS bcol1,
       b.col2 AS bcol2
    FROM a
        INNER JOIN b
            ON ...
    WHERE...

答案 1 :(得分:1)

给定一个明确枚举表和字段的dict(或其他一些数据结构),构造SQL并不太难:

import itertools as it

fields={'a':('col1','col2'),'b':('col1','col3')}

fields_sql=', '.join("{t}.{f} as '{t}.{f}'".format(f=f,t=t)
                     for t in fields for f in fields[t])
sql='''SELECT {f}
    FROM a
        JOIN b ON ...
    WHERE ...'''.format(f=fields_sql)
print(sql)

产量

SELECT a.col1 as 'a.col1', a.col2 as 'a.col2', b.col1 as 'b.col1', b.col3 as 'b.col3'
    FROM a
        JOIN b ON ...
    WHERE ...