2011-07-25 57 views
5
SELECT * FROM a, b WHERE ... 

Mysql允許在查詢結果中重複列名稱。因此,在終端中,沒有任何列名使用上述查詢作爲前綴。force mysqldb dict光標返回前綴所有列名與表名

但是,我在DictCursor中使用python中的mysqldb。結果是列名稱是鍵的字典列表。有時,字典遊標會自動爲列名添加表名。據我所知,它爲兩個不明確的列名中的第二個做了這個,但只有當第二個值是唯一的。無論如何,我想強制光標前綴表名稱的所有鍵。

mysqldb docs上fetch.row()函數...

第二個參數(如何)告訴它怎麼行應派代表參加。 默認情況下,它是零,表示作爲元組返回。如果= 1意味着, 將其作爲字典返回,其中鍵是列名稱,或者如果有兩個具有相同名稱的列(例如,從 連接),則返回table.column。 how = 2的含義與how = 1相同,只是鍵總是 table.column;這是爲了與舊的Mysqldb模塊兼容。

因此,它似乎是可行的,但我不直接使用fetch.row()函數...所以問題是,我怎麼可能會導致MySQLdb的字典光標總是使用如何= 2時它提取行?

+1

我不不知道python,但是如果你在控制檯中運行查詢,你是否仍然得到含糊列的表前綴? – Karolis

+0

@Karolis這是正確的問題,謝謝...對於初學者來說,它看起來像mysql允許重複的列名,所以它是最重要的部分mysqldb的東西。 – jmilloy

回答

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

你是對的 - 我有點懶。無論您需要多少列,您是否嚴格要求? – jmilloy

+0

@jmilloy:我是。我從來不希望查詢中斷,因爲一個新列被添加到一個表中,並且一個'SELECT *'意外地拾取了新列。 –

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 ...