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获取行?
答案 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 ...