やあ、みんな!例えば、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.csv を students テーブルに入れるには、こう書く:
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ファイルが次の条件を満たしてるかチェックしよう:
- ヘッダー行に余計な空白や隠し文字がないこと。
- 正しいエンコーディングを使うこと(PostgreSQLでは普通UTF-8がおすすめ)。
- 区切り文字と
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 は大量データの扱いをめっちゃ楽にしてくれるから!
GO TO FULL VERSION