DBにデータを追加する際、一番最初に思いつくのは、INSERTではないでしょうか。
しかし、多くのデータを追加する際にINSERTを使用すると時間がかかってしまいます。
そんな時に、役に立つのは\copy
コマンドです!
使い方を覚えて効率よくデータ追加を行えるようにしましょう!!
COPYと\copyの違い
PostgreSQLにはCOPY
というデータのインポート・エクスポート用のコマンドがありますが、\copy
はそのpsql
クライアント版です。
コマンド | 実行場所 | 権限 |
---|---|---|
COPY | サーバー側 | スーパーユーザー権限が必要 |
\copy | クライアント側 (psql ) | 一般ユーザーでも利用可能 |
COPY
はサーバー側で動作するため、スーパーユーザー権限が必要です。一方、\copy
はクライアント側で動作し、一般ユーザーでも実行できます。そのため、セキュリティ上の制約が少なく、手軽にデータを扱えます。
データをテーブルにインポートする
\copy my_table FROM 'data.csv' WITH (FORMAT csv, HEADER true);
<ポイント>・data.csv
のデータを my_table
に読み込む
・FORMAT csv
でCSV形式を指定
・HEADER true
でヘッダー行をスキップ
CSVファイルの書き方
\copy
を使用するためには、適切なフォーマットのCSVファイルを準備する必要があります。基本的なCSVの構造は以下のようになります。
例:data.csv
id,name,age
1,Alice,25
2,Bob,30
3,Charlie,28
<ポイント>
・1行目はカラム名(HEADER true
を指定した場合は無視される)
・各データをカンマ ,
で区切る
・文字列データに "
(ダブルクォート)を付けることも可能
・NULL値は空白(,,
)にする
テーブルのデータをエクスポートする
\copy my_table TO 'output.csv' WITH (FORMAT csv, HEADER true);
<ポイント>
・my_table
のデータを output.csv
に出力
・HEADER true
でヘッダーを付ける
\copyの便利なオプション
\copy
を使う際、以下のオプションを活用するとより柔軟にデータを扱えます。
デリミタを変更する
\copy my_table FROM 'data.tsv' WITH (FORMAT csv, DELIMITER E'\t', HEADER true);
TSV(タブ区切り)ファイルを読み込む場合は、DELIMITER E'\t'
を指定します。
NULLの扱いを指定する
\copy my_table FROM 'data.csv' WITH (FORMAT csv, NULL 'NULL', HEADER true);
データ内の NULL
という文字列を SQL の NULL
として扱う場合に便利です。
クォート文字を指定する
\copy my_table FROM 'data.csv' WITH (FORMAT csv, QUOTE '"', HEADER true);
データ内のカンマを正しく処理するために、QUOTE '"'
を指定できます。
まとめ
業務で使った¥copyを調べてみたら、思っていたよりもできることが多かったので、これからたくさん活用しておこうと思います。
次回は、COPYと¥copyのメリットデメリットについて学んでいきたいと思います。