[pgsql-jp: 26092] Re: \i によるインポートで文字列リテラルのエスケープが正常に解釈されない

ALIHALA Hiroshi arihara.hiroshi @ jp.fujitsu.com
2002年 5月 23日 (木) 19:01:27 JST


こんばんは

>>>>> At <Thu, 23 May 2002 17:46:09 +0900>
>>>>> In <20020523084535.31794DBC5 @ jelly.virtems.com> 
>>>>> chi <Chihiro_Kuraya @ virtems.com> wrote:

[...]

> このように INSERT 文が1万行ほど書かれたテキストファイルがあります。

 psql で \i でインポートするなら、INSERT INTO を1万行も並べるのは
あまり効率良くないですよ。
 TAB で区切って Null は \N にしてシグルクォートを消し、COPY [テーブ
ル] FROM stdin; の後そのテキストを繋げて、最後に \. を置けば pg_dump 
で取得した形式と同じになりますから、INSERT 文を解釈しない分、高速に
処理されます。

例えばこんな感じに作ればうまく処理されると思いますが:

COPY project_bill FROM stdin;
2000-10-01-01 1 Page layout at \\850/page(hoge) 10 ページ 850
2000-10-01-01 2 Page layout at \\800/page(foo) 200 ページ 800
\.

※上の例では実際に項目間のTABは入れてません(一文字の空白です)


> このファイルを psql 上から \i コマンドによってインポートを行うと、
> 次のようなエラーが起きます。

> psql:project-data.sql:8438: invalid command \
> psql:project-data.sql:8440: ERROR:  parser: parse error at or near "2000"

> 該当する 8437行目以下は次のようになっております。
> -----------------------------------------------------------------------
> INSERT INTO project_bill ( project, id, content, amount, unit, unit_price )
> VALUES ( '2000-10-01-01',1,'Page layout at \\850/page(hoge)',10,'ページ',850);
> INSERT INTO project_bill ( project, id, content, amount, unit, unit_price )
> VALUES ( '2000-10-01-01',2,'Page layout at \\800/page(foo)',200,'ページ',800);
> -----------------------------------------------------------------------

> どうも、文字列リテラル中の \\ が円マークとして解釈されていないようなのですが、
> どうしてなのでしょうかね。PostgreSQL の仕様どおりの書き方をしているはずなのですが。。。

 これは、SQL 自体は見た目問題なさそうですが、psql で \i コマンドで
処理しても問題ないかはちょっと…。
 それよりも、ちょっと手間ですが前述の方法に変えた方が良いと思います。

-- 
____________________________________________________________________
 ALIHALA Hiroshi [ arihara.hiroshi @ jp.fujitsu.com ]
  富士通(株) シスサポ本)カスタマリレーション統括部 サービス品質部
_ Don't quote a signature, when you reply a message. ____________..|



pgsql-jp メーリングリストの案内