データがすでにサーバー上にある場合、COPY コマンドを使ってそれを PostgreSQL のテーブルにロードできるよ。これは特に大量のデータを扱うときや、PostgreSQL サーバーが別マシンにある場合に便利なんだ。
サーバーサイドで実行する COPY コマンドは、実際のプロジェクトでめっちゃ便利。まず、ファイルがすでにサーバーにあるからネットワーク越しに転送する必要がなくて、めっちゃ速い。それに、ローカルPCからデータをコピーしなくていいからセキュリティ的にも安心。さらに、自動化されたサーバースクリプトやバックグラウンドサービスにも簡単に組み込めるよ ― 例えば、分析用テーブルを定期的に更新したいときとかね。
COPY コマンドの構文
COPY コマンドはシンプルだけど、いくつか気をつけるポイントがあるよ:
COPY table_name
FROM '/path/to/file.csv'
WITH (FORMAT CSV, HEADER TRUE);
table_name— データをロードしたいテーブル名。/path/to/file.csv— サーバー上のファイルのフルパス。WITHオプションでファイル形式やヘッダーの有無、区切り文字など色々指定できるよ。
COPY コマンドの使い方例
ちょっとした例を見てみよう。例えば、学生データの CSV ファイルを PostgreSQL にロードしたいとする。ファイルはサーバーの /var/lib/postgresql/data/students.csv にあるとするよ。
ステップ1. データ用テーブル
まず、データをロードできるテーブルがDBにあるか確認しよう:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
registration_date DATE
);
このテーブルは学生の名前、メールアドレス、登録日を保存するよ。
ステップ2. CSVファイル
/var/lib/postgresql/data/students.csv ファイルはこんな感じ:
id,name,email,registration_date
1,Alex Lin,alex.lin@example.com,2023-09-01
2,Maria Chi,maria.chi@example.com,2023-09-02
3,Peter Ming,peter.ming@example.com,2023-09-02
ステップ3. COPY コマンド
じゃあ、COPY を使ってファイルからテーブルにデータをロードしよう:
COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, HEADER TRUE);
ここで:
FORMAT CSVはファイルがCSV形式だよって PostgreSQL に伝える。HEADER TRUEはファイルの最初の行がカラム名(ヘッダー)だよって意味。
コマンドを実行すると、ファイルのデータが students テーブルに入るよ。
結果の確認
データをロードしたら、ちゃんと入ったか確認しよう:
SELECT * FROM students;
テーブルにロードされたファイルの行が見えるはず:
| id | name | registration_date | |
|---|---|---|---|
| 1 | Alex Lin | alex.lin@example.com | 2023-09-01 |
| 2 | Maria Chi | maria.chi@example.com | 2023-09-02 |
| 3 | Peter Ming | peter.ming@example.com | 2023-09-02 |
権限設定
PostgreSQL が COPY コマンドを使うには、ファイルにアクセスできないとダメ。権限がちゃんと設定されてないとエラーになるよ。例えば:
ERROR: could not open file "/var/lib/postgresql/data/students.csv" for reading: Permission denied
こういう問題を避けるには、次のことを確認しよう:
- ファイルが PostgreSQL ユーザー(たいてい
postgres)で読めるようになってるか。 - ファイルとディレクトリの権限をチェックしよう:
ls -l /var/lib/postgresql/data/students.csv
権限が足りなかったら、こうやって変更できるよ:
chmod 644 /var/lib/postgresql/data/students.csv
chown postgres:postgres /var/lib/postgresql/data/students.csv
ここでは Linux の話をしてるよ。Windows の権限設定は普通 Windows 管理者がやるし、このコースの範囲外だよ。
COPY コマンドの制限
COPY を使うときは、いくつか注意点がある:
ファイルパス:絶対パスを指定しよう。PostgreSQL は相対パスを認識しないことがあるよ。
ファイルのエンコーディング:CSVファイルのエンコーディングがDBと違う場合(例えば Windows-1251 じゃなくて UTF-8 など)、明示的にエンコーディングを指定しよう:
COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, ENCODING 'WIN1251', HEADER TRUE);
ファイル構造のエラー:ファイルの構造がテーブルと合ってない、またはデータが変(例えば数値カラムにテキストが入ってる)と、ロード時にエラーになる。ロード前にデータをちゃんとチェックしよう!
実践的な使い道
サーバーからデータをロードするための COPY の使い道はいろいろあるよ:
- データ移行:サーバーやDB間で大量のデータを移動できる。
- 外部システムとの連携:多くのシステムはCSVファイルでデータをエクスポートする。
COPYならそういうデータもサクッと PostgreSQL に取り込める。 - 分析レポートの準備:サーバーから自動でデータをロードすれば、大量データの分析もスピーディーにできるよ。
よくあるエラーとその対処法
COPY を使ってると、いろんなエラーに出会うことがある:
問題:ファイルが見つからない
エラーメッセージ:could not open file for reading: Permission denied。
対処法:ファイルが PostgreSQL ユーザー(postgres)で読めるか、権限を確認しよう。
問題:ファイル形式が違う
エラーメッセージ:malformed CSV line。
対処法:空行やデータのミス、変な文字がないかファイルをチェック。区切り文字も正しいか確認しよう。
問題:データ構造が合わない
エラーメッセージ:ERROR: invalid input syntax for type integer。
対処法:テーブルのカラムがファイルのデータ構造と合ってるか確認しよう。例えば、数値データは数値カラム、日付は DATE 型カラムに入れる必要があるよ。
これでサーバーからデータをロードするための COPY の使い方はバッチリ!このスキルをプロジェクトで使って、DB作業をもっと効率化しよう!
GO TO FULL VERSION