前回で address テーブルを作ったので、そいつにデータを入れてみたい。
データを入れるには SQL の INSERT 文を使う。
SQL 文は psql ターミナルから打ち込む。こげな文になると思われ。
INSERT INTO address (name, tel, email)
VALUES ('Watashi', '234-8900', 'aa@bb.net');
改行があるけど本当は1行です。
しかし、いちいち psql からこげな文を入力できるかい。
うれしいことに、外部ファイルから流し込む方法があった。あたり前か。
前回の最後で address テーブルを削除しちゃったので、address テーブルを作るとこからデータを挿入するとこまでの SQL 文を書いちゃう。
以下の内容のテキストファイルをファイル名 create1.sql で作る。
CREATE TABLE address (
name varchar(50),
tel varchar(50),
email varchar(50)
);
INSERT INTO address (name, tel, email)
VALUES ('Watashi', '234-8900', 'aa@bb.net');
INSERT INTO address (name, tel, email)
VALUES ('Omae', '321-0000', 'ff@bb.net');
INSERT INTO address (name, tel, email)
VALUES ('Anta', '234-0000', 'dd@ff.net');
見やすいようにインデント付けてみた。
で、psql で流し込む。
postgres$ psql mydb
mydb=# \i create1.sql
CREATE
INSERT 16621 1
INSERT 16622 1
INSERT 16623 1
うまくいったか SELECT で一覧表示してみる。
mydb=# SELECT * FROM address;
name | tel | email
---------+----------+-----------
Watashi | 234-8900 | aa@bb.net
Omae | 321-0000 | ff@bb.net
Anta | 234-0000 | dd@ff.net
(3 rows)
うまくいったね。
外部ファイルに書いたとしてもだ、INSERT 文を羅列するのはめんどくさ。
タブ区切りで書かれたデータを挿入するやりかたがあった。あたり前か。
SQL の COPY を使うとタブ区切りデータを挿入できる。
copy.sql として以下のファイルを作ってみる。
COPY address FROM stdin;
Hoo 34-00256 rr@jj.com
Zcc 456-0955 yy@pp.hh
Good 5667-666 tt@pp.hh
\.
そいで実行・一覧表示と。
mydb=# \i copy.sql
mydb=# SELECT * FROM address;
name | tel | email
---------+----------+-----------
Watashi | 234-8900 | aa@bb.net
Omae | 321-0000 | ff@bb.net
Anta | 234-0000 | dd@ff.net
Hoo | 34-00256 | rr@jj.com
Zcc | 456-0955 | yy@pp.hh
Good | 5667-666 | tt@pp.hh
(6 rows)
うまくいきました。
外部ファイルからデータを出し入れするには psql の \copy コマンドを使うやり方もある。
\copy コマンドって言っても内部的には SQL の COPY をガッツンガッツン実行しているらしいので、速度を求めるなら COPY を使うとうれしいらしい。
書式は以下のようになっとる。
\copy table [ with oids ] { from | to } filename | stdin | stdout [ using delimiters 'characters' ]
よくわからんけど、試しに CSV ファイルを作って挿入してみる。
ファイル名 input.csv で以下のようなファイルを作りーの、、
どなたか,444-000,jj@ppp.ne
お前さん,666-000,88@pp.kk
山田くん,667-00,67y@pp.kk
ドラミちゃん,678-098,tt@ok.ne
日本語を入れてみた。注意したいのは文字コード。
Linux だけん、EUC+LF で保存する。FTP で上げるときもバイナリモードで上げる。
それで \copy を実行。
mydb=# \copy address FROM input.csv USING DELIMITERS ','
\.
いい感じ。うまくいったか一覧表示。
mydb=# SELECT * FROM address;
name | tel | email
--------------+----------+-----------
Watashi | 234-8900 | aa@bb.net
Omae | 321-0000 | ff@bb.net
Anta | 234-0000 | dd@ff.net
Hoo | 34-00256 | rr@jj.com
Zcc | 456-0955 | yy@pp.hh
Good | 5667-666 | tt@pp.hh
どなたか | 444-000 | jj@ppp.ne
お前さん | 666-000 | 88@pp.kk
山田くん | 667-00 | 67y@pp.kk
ドラミちゃん | 678-098 | tt@ok.ne
(10 rows)
しめしめ。日本語もちゃんと表示されました。
んで次に、こいつらを CSV ファイルに書き出してみる。
mydb=# \copy address TO out.csv USING DELIMITERS ','
ちゃんと書き出されたか?
postgres$ cat out.csv
Watashi,234-8900,aa@bb.net
Omae,321-0000,ff@bb.net
Anta,234-0000,dd@ff.net
Hoo,34-00256,rr@jj.com
Zcc,456-0955,yy@pp.hh
Good,5667-666,tt@pp.hh
どなたか,444-000,jj@ppp.ne
お前さん,666-000,88@pp.kk
山田くん,667-00,67y@pp.kk
ドラミちゃん,678-098,tt@ok.ne
うまくいったようや。ちなみに out.csv は EUC+LF になる。
('02.11.28)