强制mysqldb字典游标返回所有列名前缀表名

5 投票
2 回答
1737 浏览
提问于 2025-04-16 22:14
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...

撰写回答