mysqldb dict cursorを強制してプレフィックスを返すようにすべての列名をテーブル名で返します

StackOverflow https://stackoverflow.com/questions/6821677

質問

SELECT * FROM a, b WHERE ...

MySQLを使用すると、クエリの結果で列名を重複させます。したがって、端末では、上記のクエリを使用して列名はいずれも前に貼られていません。

ただし、DictCursorでPythonでmysqldbを使用しています。結果は、列名がキーである辞書のリストです。時には、DICTカーソルが列名をテーブル名に自動的にプレフィックスに付けることがあります。私が知る限り、2つの曖昧な列名の2番目にこれを行いますが、2番目の値が一意である場合にのみ。とにかく、カーソルにすべてのキーをテーブル名でプレフィックスに強制したいと思います。

から mysqldbドキュメント fetch.row()function ...

2番目のパラメーター(方法)は、行の表現方法を示します。デフォルトでは、ゼロです。つまり、タプルとして戻ります。方法= 1は、キーが列名である辞書として返送する方法、または同じ名前の2つの列がある場合はtable.columnです(たとえば、結合から)。方法= 2は、キーが常にtable.columnであることを除いて、= 1と同じことを意味します。これは、古いMySQLDBモジュールと互換性があります。

だから、それは実行可能なようですが、私はfetch.row()関数を直接使用していません...だから質問は、 MySQLDB DICTカーソルが行を常に使用するにはどうすればよいですか?

役に立ちましたか?

解決

私は使用の大ファンではありません * クエリで。必要に応じて、列をリストし、独自のエイリアスを割り当てます。ご覧のとおり、私は暗黙の参加のファンでもありません。

SELECT a.col1 AS acol1,
       a.col2 AS acol2,
       b.col1 AS bcol1,
       b.col2 AS bcol2
    FROM a
        INNER JOIN b
            ON ...
    WHERE...

他のヒント

テーブルとフィールドを明示的に列挙する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 ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top