强制mysqldb字典游标返回所有列名前缀表名
SELECT * FROM a, b WHERE ...
MySQL在查询结果中允许出现重复的列名。因此,在终端中,使用上述查询时,列名并没有被加上前缀。
不过,我在Python中使用mysqldb和DictCursor。查询结果是一个字典的列表,其中列名是字典的键。有时候,字典游标会自动在列名之前加上表名。根据我的观察,它会对两个名字重复的列中的第二个列名加上前缀,但只有当第二个值是唯一的情况下。总之,我想强制游标在所有键前面都加上表名。
根据mysqldb文档中关于fetch.row()函数的说明……
第二个参数(how)告诉它行应该如何表示。默认值是零,这意味着返回一个元组。how=1表示返回一个字典,字典的键是列名,或者是表名.列名,如果有两个列名相同的情况(比如,来自连接查询)。how=2的意思和how=1一样,只是键总是表名.列名;这是为了与旧版的Mysqldb模块兼容。
所以,这看起来是可以做到的,但我并没有直接使用fetch.row()函数……所以问题是,我该如何让mysqldb的字典游标在获取行时总是使用how=2呢?
2 个回答
1
给定一个字典(或者其他一些数据结构),它明确列出了表格和字段,构建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 ...
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...