5
SELECT * FROM a, b WHERE ...

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

但是,我在 python 中使用 mysqldb 和 DictCursor。结果是一个字典列表,其中列名是键。有时,dict 游标会自动在列名前加上表名。据我所知,它对两个模棱两可的列名中的第二个执行此操作,但前提是第二个值是唯一的。无论如何,我想强制光标在所有键前面加上表名。

从 fetch.row() 函数的mysqldb 文档中......

第二个参数(how)告诉它应该如何表示行。默认情况下,它为零,这意味着作为元组返回。how=1 表示,将其作为字典返回,其中键是列名,如果有两个具有相同名称的列(例如,来自连接),则返回 table.column。how=2 的含义与 how=1 相同,只是键始终是 table.column; 这是为了与旧的 Mysqldb 模块兼容。

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

4

2 回答 2

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...
于 2011-07-25T20:18:53.180 回答
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 ...
于 2011-07-25T20:30:04.340 回答