前回の投稿で、\copyコマンドの基本的なことを学びましたね。
まだみていない方は、下記を読んでみてください!

【PostgreSQL】\copyコマンドを徹底解説!①
DBにデータを追加する際、一番最初に思いつくのは、INSERTではないでしょうか。しかし、多くのデータを追加する際にINSERTを使用すると時間がかかってしまいます。そんな時に、役に立つのは\copyコマンドです!使い方を覚えて効率よくデー...
\copyとCOPYのメリット・デメリット
\copyのメリット
- 一般ユーザーでも利用可能:スーパーユーザー権限なしで実行可能
- ローカルファイルとのやり取りが簡単:クライアント側で実行できる
- セキュリティリスクが少ない:サーバーのファイルシステムにアクセスしないため、安全
- 構文がシンプル:
psql
内で直感的に使える
\copyのデメリット
- 大量データ処理には向かない:サーバー経由ではなくクライアントで処理するため、パフォーマンスが劣る場合がある
- リモートサーバーのデータと直接やり取りできない:ローカルファイルのみが対象
- サーバー内のファイルにはアクセスできない:サーバー上の
/tmp
や/var/lib/postgresql/
のデータを扱えない
COPYのメリット
- サーバー側で処理できるため高速:大量のデータを扱う際に有利
- リモートサーバーでも利用可能:サーバー上のファイルを直接指定できる
- バックアップやバルクデータロードに適している:高速なデータ移行が可能
COPYのデメリット
- スーパーユーザー権限が必要:一般ユーザーは実行できない
- ローカルファイルを直接扱えない:
\copy
のように手軽にローカルファイルを使えない
\copyを使う際の注意点
ファイルのパス指定
- 絶対パス(
/home/user/data.csv
)または~
(ホームディレクトリ)を指定する - Windowsではパス区切りを
\
ではなく/
にする
パーミッションエラーの対処法
psql
を実行しているユーザーがファイルの読み書き権限を持っているか確認chmod
コマンドで権限を変更(例:chmod 644 data.csv
)
エンコーディングの問題
- CSVファイルのエンコーディングがデータベースと一致しない場合、エラーが発生する
ENCODING 'UTF8'
を指定することで対処可能
\copyの応用テクニック
1. SELECTの結果をCSVにエクスポート
\copy (SELECT * FROM my_table WHERE created_at > '2024-01-01') TO 'filtered_output.csv' CSV HEADER;
条件付きでデータをエクスポートしたい場合に便利です。
2. 標準入力からデータをインポート
cat data.csv | psql -d mydb -c "\copy my_table FROM STDIN WITH (FORMAT csv, HEADER true)"
シェルスクリプトなどで標準入力を使ってデータをインポートできます。
まとめ
前回の投稿に引き続き、コピーについて学んでいきました。
1つずつできることが増えると嬉しいですよね!
実際に使ってみることでより理解することにつながると思いますので、実際にテーブル作って試してみてください!!