CodeGym /コース /SQL SELF /CSVファイルからデータをインポートする時の `COPY` コマンドの使い方

CSVファイルからデータをインポートする時の `COPY` コマンドの使い方

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

やあ、みんな!例えば、Excelの表に1万行あって、上司がこう言うんだ:「これ、データベースに入れといて!」 うーん…手作業でINSERTしてたら…たぶんSQLスキルだけじゃなくて休暇も必要になるよね。😅

ラッキーなことに、PostgreSQLにはCSVからDBにテレポートしてくれるコマンドがあるんだ。それが COPY。このコマンドはデータを一瞬でまとめて余計な手間なくインポートできる。今日は COPY の仕組み、データ準備のコツ、CSVに「謎のカンマ」や変な文字があった時の対処法まで、一緒に見ていこう!

COPY コマンドの基本

COPY はPostgreSQLのコマンドで、テーブルとファイルシステム間でデータをやりとりできる。大量データのインポートやエクスポートに便利だよ。

COPY でテーブルにデータを入れる時の書き方例

COPY table_name FROM 'path/to/your/file.csv' DELIMITER ',' CSV HEADER;

主なパラメータ

  • FROM 'path/to/your/file.csv': CSVファイルのパスを指定する。
  • DELIMITER ',': 区切り文字(ここではカンマ)を指定する。
  • CSV HEADER: CSVファイルの1行目がカラム名(ヘッダー)だよ、って教える。

COPY コマンドはサーバー側で直接動くから、大量データでもめっちゃ速い!

COPY\COPY の違い

たまに COPY\COPY の違いで混乱することがあるかも。

  • COPY: サーバー側で実行。サーバー上にあるファイルを読み込む時に使う。
  • \COPY: クライアントコマンド(psqlで使える)。ローカルPCからデータをインポートする時に使う。

ローカル環境で作業してるなら、たぶん \COPY を使うことが多いよ。これはまた後で説明するね。

COPY の使い方例

じゃあ、実際に例を見てみよう。やってみるのが一番わかりやすいからね。

ステップ1:テーブルを準備する

例えば、学生情報を保存するテーブルを作るとする:

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    date_of_birth DATE,
    grade FLOAT
);

ステップ2:CSVファイルを準備する

CSVファイルのフォーマットはテーブルと同じにしよう。例えば students.csv だと:

first_name,last_name,date_of_birth,grade
John,Doe,2001-05-15,85.5
Jane,Smith,2000-12-22,90.0
Alice,Johnson,2002-03-10,78.0
Bob,Brown,2001-08-30,NULL

ポイント:CSVのカラム順はテーブルと同じにして、データ型も合わせてね(例えば日付は YYYY-MM-DD 形式)。

ステップ3:データをインポートする

students.csvstudents テーブルに入れるには、こう書く:

COPY students (first_name, last_name, date_of_birth, grade)
FROM '/path/to/your/students.csv'
DELIMITER ',' 
CSV HEADER;

これ、何してるの?

  • テーブル名 students と、インポートするカラムを指定してる。
  • ファイルのパスで場所を教えてる。
  • 区切り文字 , でカンマ区切りだよって指定。
  • CSV HEADER で、1行目はカラム名だよってPostgreSQLに伝えてる。

結果:

コマンドを実行すると、ファイルのデータがテーブルに入る。すぐ確認できるよ:

SELECT * FROM students;

制限と注意点

エラーを避けるために、CSVファイルが次の条件を満たしてるかチェックしよう:

  1. ヘッダー行に余計な空白や隠し文字がないこと。
  2. 正しいエンコーディングを使うこと(PostgreSQLでは普通UTF-8がおすすめ)。
  3. 区切り文字と DELIMITER パラメータが一致してること。

COPY でよくあるエラー:

データ構造が合ってない場合。 例えば、数値カラムにテキストを入れようとすると:

ERROR: invalid input syntax for type numeric: "abc"

こういう時は、データ型が合ってるかちゃんと確認しよう。

ファイルパスのエラー。

ファイルがPostgreSQLサーバーから見えない場所にあると、こんなエラーが出る:

ERROR: could not open file "/path/to/your/file.csv" for reading: Permission denied

解決策は、ファイルの権限を正しく設定すること。

データがちゃんと入ったか確認するには?

インポート後は、ちゃんと入ったかチェックしよう。例えば:

全行数を確認:

SELECT COUNT(*) FROM students;

NULL値を探す(例えば grade カラムが NULL の行):

SELECT * FROM students WHERE grade IS NULL;

COPY を使う時の便利なコツ

エラーログを取ろう。 エラーを別ファイルに記録したい時は LOG ERRORS パラメータを使おう(PostgreSQL 12+)。

インデックスやトリガーを一時的に無効化しよう。

大量データを入れる時は、一時的にインデックスを無効化できる:

ALTER TABLE students DISABLE TRIGGER ALL;

トランザクションを使おう。

これで「全部入るか、全部ロールバック」みたいなアトミックなインポートができる:

BEGIN;
COPY students FROM '/path/to/your/file.csv' CSV HEADER;
COMMIT;

実践的な使い方

COPY コマンドを使いこなせると、DB管理者だけじゃなく開発者にもめっちゃ便利。例えば、外部APIから大量データをもらった時、まずCSVに保存して、PostgreSQLに一気にインポートして分析開始!とか、同僚から「古いDBを新しいPostgreSQLに移して」って頼まれた時も、COPY が救世主になる。

CSVファイルは現場でよく出てくる。例えば:

  • 売上データを分析システムにインポートする時。
  • 外部CRMからユーザーリストを取り込む時。
  • ExcelからPostgreSQLにデータを移す時、余計な手間なしでできる。

これで COPY コマンドの基本はおしまい!次のレクチャーでは、データインポート用のテーブル設計や、パフォーマンス・信頼性を考えた構造の作り方を話すよ。まずは色々試してみて!COPY は大量データの扱いをめっちゃ楽にしてくれるから!

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION