Hatena::ブログ(Diary)

130単位

2008-06-13

PostgreSQL CSVファイルからのインポート

EC-CUBEのカスタマイズをしていると、テストデータを作成して動きを確認したいことがよくあります。しかしpgAdminでは、プライマリキーのないテーブルには直接データを作成・編集することができません。参考

それでは、EXCELにて作成したcsvファイルをどうにかインポートできないものか。調べてみたところ、メニューなどからのインポートはできないみたいですが、「COPY」というSQLコマンドを使えば可能なようです。

COPY : PostgreSQL日本語ドキュメント
http://www.postgresql.jp/document/current/html/sql-copy.html

「tablename」という名前のテーブルに「testdata.csv」からインポートする場合のSQL例。

COPY tablename FROM 'C:/test/testdata.csv' WITH CSV;

OSWindowsであっても、パスの指定は「/」で問題ないようです。ただし以下の場合はだめでした。

-- 「\」1つではエスケープされるのでだめ
COPY tablename FROM 'C:\test\testdata.csv' WITH CSV;
-- WARNING:  nonstandard use of escape in a string literal
-- ERROR:  could not open file "C:testtestdata.csv" for reading: No such file or directory

-- 「\」2つでもなぜかエラーが出てだめ、ではなくて、警告が出るが実行はOK
COPY tablename FROM 'C:\\test\\testdata.csv' WITH CSV;
-- WARNING:  nonstandard use of \\ in a string literal
-- HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.

-- ヒントにあるように「E」をつければ警告なしで実行OK
COPY tablename FROM E'C:\\test\\testdata.csv' WITH CSV;

-- パスに日本語が入っているとだめ(マルチバイトへの何らかの対応が必要?)
COPY tablename FROM 'C:/Documents and Settings/User/デスクトップ/testdata.csv' WITH CSV;
-- ERROR:  could not open file "C:/Documents and Settings/User/デスクトップ/testdata.csv" for reading: No such file or directory

あと、文字コードがファイルとDBで異なっていてもエラーとなります。

-- ERROR: invalid byte sequence for encoding "UTF8"

EXCELで作成したCSVだとShift-JISになってしまうので、エディタで変換して保存し直すか、

SET client_encoding TO 'SJIS';
COPY tablename FROM 'C:/test/testdata.csv' WITH CSV;

とすれば大丈夫なようです。以下サイトが参考になります。

tomimemo - postgresqlメモ
http://www3.atwiki.jp/tmogmni/pages/21.html#id_9e61ee0c

途中、パスについての部分は記憶を頼りに書いたので間違いがあるかもです。発覚次第訂正いたします。

※6/14追記 再度試した結果、加筆・修正しました。


4798123358
PostgreSQL徹底入門 第3版

関連記事

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元