mysqldb dict cursorを強制してプレフィックスを返すようにすべての列名をテーブル名で返します
-
26-10-2019 - |
質問
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 ...