結合内のテーブル名でフィールド名のプレフィックスやポストフィックスを行うこのような機能は、ANSISQL標準に含める必要があると確信しています。現在、2019年には、それを行うためのエレガントなクロスプラットフォームの方法はまだありません。残っているのは、エイリアスを使用した見栄えが悪く、エラーが発生しやすい手動ハッキング、または動的SQLを含むプラットフォーム固有のソリューションです。'dot-star'(。*)で示されるフィールドにカスタムプレフィックスまたは/およびポストフィックスを指定する機能があると、誰もが本当に恩恵を受けるでしょう。このような機能を追加した後のサンプル選択は次のようになります。
select a.* use prefix,b.* use postfix '_b' from table_a a inner join table_b b on a.id=b.id
ご覧のとおり、デフォルトでは、プレフィックスまたはポストフィックスはテーブル名(またはエイリアス名)と等しく、任意の文字列リテラルでオーバーライドできます。
また、標準に追加されるのは、すべてのフィールドを選択するためのショートカットである「スター付き」(*)出力から特定のフィールドを除外する機能です。ネットワークデータ転送や簡潔さを減らすために含めたくないファイルをリストするために、キーワードを 除いて追加します。例:
select * except large_binary_data_field,another_notneeded_field,etc from my_table
このような機能により、スターと不要ないくつかのフィールドのみを指定するのではなく、必要なフィールドの完全な(そして潜在的に大きな)リストを明示的に指定する必要がなくなります。
したがって、この投稿を読んでANSI SQL標準インフルエンサーに連絡できる人は誰でも、何をすべきかを知っています)
PS さらに別の醜いですが、少なくとも自動化された汎用の動的SQLラッパー
psycopgを使用するPython支持者のために、ここに私が使用する便利なサブがあります(SQLインジェクションの可能性があるため、厳密には内部的に)
def get_table_fields(table,alias,prefix='',suffix='',excluding=''):
if type(excluding)==str: excluding=excluding.split(',')
cur.execute('select * from '+table+' where 0=1');cur.fetchall()
if not (cur.description is None):
return ','.join([alias+'.'+col.name+' '+prefix+col.name+suffix for col in cur.description if not (col.name in excluding)])
そして、3つのテーブルを結合していて、データセットテーブルから大きなデータフィールドをフェッチしないようにしたい呼び出しコード:
sql="""select %s,%s,%s from tasks t,features_sets f,datasets d
where
t.is_active=true and f.is_active=true
and f.task=t.id and t.train_dataset=d.id
""" % (
get_table_fields('tasks','t',prefix='ts_'),
get_table_fields('features_sets','f',prefix='fs_'),
get_table_fields('datasets','d',prefix='ds_',excluding='data')
)
それは私のために強力に展開されます
select t.id ts_id,t.project ts_project,t.name ts_name,***,
fs_id,f.task fs_task,f.name fs_name,f.description fs_description,***,
d.id ds_id,d.project ds_project,d.name ds_name,***
from tasks t,features_sets f,datasets d
where
t.is_active=true and f.is_active=true
and f.task=t.id and t.train_dataset=d.id
ここで、***は他の多くの有用なフィールドを意味し、それらのいくつかは複数のテーブルに共通です(したがって、接頭辞が必要です)。curは明らかにpsycopgカーソルであり、0 = 1条件は、実際のデータなしでフィールド名のみを取得することを目的としています。