5
SELECT * FROM a, b WHERE ...

Mysqlでは、クエリの結果に重複する列名を含めることができます。したがって、ターミナルでは、上記のクエリを使用して列名のプレフィックスが付けられることはありません。

ただし、PythonでDictCursorを使用してmysqldbを使用しています。結果は、列名がキーである辞書のリストです。場合によっては、dictカーソルが自動的に列名の前にテーブル名を付けます。私の知る限り、これは2つのあいまいな列名の2番目に対して行われますが、2番目の値が一意である場合に限ります。とにかく、カーソルにすべてのキーの前にテーブル名を付けるように強制したいと思います。

fetch.row()関数のmysqldbドキュメントから...

2番目のパラメーター(how)は、行をどのように表現するかを示します。デフォルトではゼロです。つまり、タプルとして返されます。how = 1は、キーが列名であるディクショナリとして返すか、同じ名前の列が2つある場合はtable.columnを返します(たとえば、結合から)。how = 2は、キーが常にtable.columnであることを除いて、how=1と同じことを意味します。これは、古いMysqldbモジュールとの互換性のためです。

したがって、実行可能に見えますが、fetch.row()関数を直接使用していません...問題は、mysqldbdictカーソルが行をフェッチするときに常に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

テーブルとフィールドを明示的に列挙する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 ...
于 2011-07-25T20:30:04.340 に答える