COPYコマンドの自明ではない挙動

PostgreSQLの COPYコマンドは、テーブルデータをCSVファイルなどの形式でインポート/エクスポートする機能です。

COPY\copyがあり、COPYはサーバー側、\copyはpsqlクライアント側で動作します。
参照するファイルをどちらのマシンで扱うかにより使い分けます。

典型的なコマンド例は以下のとおりです。

\copy <table_name> FROM|TO <file_path> CSV DELIMITER ',' HEADER;

FROMTOはインポート/エクスポートの選択です。CSV以降はオプションです。

  • CSVはフォーマット指定。デフォルトはtext
  • DELIMITER ','はファイルのフィールド区切り文字
    • CSVのデフォルトはカンマ区切りであるため省略可能
    • タブ区切りファイルなどでは指定が意味を持つ
  • HEADERはCSVの先頭行をヘッダーとして扱うオプション
    • インポート時のHEADERは1行目を読み飛ばすだけで、カラムを自動で割り当てる挙動はとらない

CSVのカラム指定

HEADERオプションは期待と異なる挙動でしょう。
同じスキーマのテーブルであっても、別DBにインポートすると順序が異なることがあります。

CSVとカラムのマップは、次のようにテーブル名のあとにカンマ区切りのカラム名を指定します。

\copy <table_name> (columns) FROM ...

このカラム定義は、既存DBからエクスポートしたCSVであればそのまま流用できるでしょう。

エクスポート時のクエリ

用途のバリエーションとして、エクスポート時にはテーブルのほか次のようにSELECTクエリを書けます。

\copy (SELECT ...) TO <file_path> ...

分析用のファイル出力に活用できます。

中馬崇尋
Chuma Takahiro