Tech Blog

PostgreSQLでCSVファイルをインポートする手順

2020-04-13

CSVファイルをPostgreSQLにインポートする方法です。 2つのやり方を紹介します。

テスト実行環境作成

ローカル環境にテスト用のCSVファイルが必要です。 あらかじめ作成しておきます。

Postgresの、DBサーバはDockerコンテナで作成します。

CSVファイルを作成する

cat products.csv
id,name,price
1,cake,500
2,juice,300
3,cookie,100

CSVファイルの文字コードを確認する

file --mime products.csv
products.csv: text/plain; charset=us-ascii

PostgreSQLのコンテナを立ち上げる

docker run \
--name my-postgres \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
-d postgres
 
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
72c628ab5d8f        postgres            "docker-entrypoint.s…"   About a minute ago   Up About a minute   5432/tcp            some-postgres

\copyコマンドでCSVファイルのインポートを行う

\copyコマンドはCSVファイルがホストマシンにある場合にリモートのDBサーバーに対して実行できます。

psql -h localhost -p 5432 -U postgres -d postgres
postgres=# create table products (id int, name varchar(255), price int);
postgres=# \copy products from ~/Desktop/products.csv with csv header encoding 'UTF8'
COPY 3
postgres=# select * from products;
 id |  name  | price
----+--------+-------
  1 | cake   |   500
  2 | juice  |   300
  3 | cookie |   100
(3 rows)
postgres=# drop table products;

COPYコマンドでCSVファイルのインポートを行う

COPYコマンドは、DBサーバーにファイルが存在する場合に利用できるコマンドです。 ホストマシンから、dockerコンテナにcpコマンドでcsvファイルをアップロードし、試してみました。

docker cp products.csv my-postgres:/tmp/products.csv
docker exec my-postgres cat /tmp/products.csv
id,name,price
1,cake,500
2,juice,300
3,cookie,100
psql -h localhost -p 5432 -U postgres -d postgres
postgres=# COPY products FROM '/tmp/products.csv' with csv header encoding 'UTF8';
COPY 3
postgres=# select * from products;
 id |  name  | price
----+--------+-------
  1 | cake   |   500
  2 | juice  |   300
  3 | cookie |   100
(3 rows)