web-dev-qa-db-ja.com

PostgreSQLのCOPYコマンドには、CSV列をマップするフィールドを選択するオプションがありますか?

PostgreSQL COPYコマンドには、CSV列をマップするフィールドを選択するオプションがありますか?

PostgreSQL COPYコマンドは、ターゲットテーブルがその列と正確に一致することを期待しているようです。私は何かが足りないのですか、それとも実際にどのように機能するのですか?

それを可能にするいくつかの代替コマンドはありますか?

4
vfclists

それは絶対に可能です-いつでも役立つ documentation が再び助けになります:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

つまり、次のようなことを実行できます。

COPY my_table (mt_id, mt_name, mt_created_by, ...)
    FROM 'filename' [...]

CSVファイルの列を参照することはできません。これを克服するには、列の数とタイプが一致する中間テーブルを作成し、その中にCOPYを実行してから、最終的な宛先に対してINSERT ... SELECT ...を実行します。 Patrick7 からの重要な注釈に基づいて、中間テーブルは UNLOGGED として定義でき、テーブルが大きい場合にWALオーバーヘッドを大幅に節約できます。

13
dezso

CSVKit のコピーを自分で入手する

in2csv foo.csv 
  | csvcut -C "columnIDontWant,AnotherIDontWant" 
  | csvsql --db postgresql://localhost/dbname --insert --tables Foo --no-create

または csvquote

csvquote | cut -d, -f... | csvquote - u | psql ...
3
Neil McGuigan