CodeGym /コース /SQL SELF /サーバーからデータをロードするための COPY の使い方

サーバーからデータをロードするための COPY の使い方

SQL SELF
レベル 23 , レッスン 4
使用可能

データがすでにサーバー上にある場合、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 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

権限設定

PostgreSQL が COPY コマンドを使うには、ファイルにアクセスできないとダメ。権限がちゃんと設定されてないとエラーになるよ。例えば:

ERROR:  could not open file "/var/lib/postgresql/data/students.csv" for reading: Permission denied

こういう問題を避けるには、次のことを確認しよう:

  1. ファイルが PostgreSQL ユーザー(たいてい postgres)で読めるようになってるか。
  2. ファイルとディレクトリの権限をチェックしよう:
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作業をもっと効率化しよう!

2
タスク
SQL SELF, レベル 23, レッスン 4
ロック未解除
テーブルの作成とサーバーからのデータ読み込み
テーブルの作成とサーバーからのデータ読み込み
1
アンケート/クイズ
CSVからのデータ挿入、レベル 23、レッスン 4
使用不可
CSVからのデータ挿入
CSVからのデータ挿入
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION