10

hstore のドキュメントでは、一度に 1 行ずつ hstore に「挿入」を使用することについてのみ説明しています。とにかく、メガバイトまたはギグになる可能性のある数10万行をpostgres hstoreに一括アップロードする方法はありますか?

コピー コマンドは、csv ファイルの列をアップロードする場合にのみ機能するようです

誰かが例を投稿できますか? できれば、python/psycopg で動作するソリューション

4

3 に答える 3

6

上記の回答は、hstoreタイプの列を含む複数の列にコピーし、コンマ区切り文字を使用しようとすると、次のように混乱するという点で不完全に見えます。

$ cat test
1,a=>1,b=>2,a
2,c=>3,d=>4,b
3,e=>5,f=>6,c

create table b(a int4, h hstore, c varchar(10));
CREATE TABLE;
copy b(a,h,c) from 'test' CSV;
ERROR:  extra data after last expected column
CONTEXT:  COPY b, line 1: "1,a=>1,b=>2,a"

同様に:

copy b(a,h,c) from 'test' DELIMITER ',';
ERROR:  extra data after last expected column
CONTEXT:  COPY b, line 1: "1,a=>1,b=>2,a"

ただし、これは、CSVとしてインポートし、hstoreにインポートするフィールドを引用することで修正できます。

$ cat test
1,"a=>1,b=>2",a
2,"c=>3,d=>4",b
3,"e=>5,f=>6",c

copy b(a,h,c) from 'test' CSV;
COPY 3
select h from b;
         h          
--------------------
 "a"=>"1", "b"=>"2"
 "c"=>"3", "d"=>"4"
 "e"=>"5", "f"=>"6"
(3 rows)

引用はCSV形式でのみ許可されるため、CSVとしてインポートする必要がありますが、COPYのDELIMITERおよびQUOTE引数を使用して、フィールド区切り文字と引用文字を非'、'、および'"'値に明示的に設定できます。

于 2012-07-17T17:41:37.373 に答える
3

挿入とコピーの両方が私にとって自然な方法で機能しているようです

create table b(h hstore);
insert into b(h) VALUES ('a=>1,b=>2'::hstore), ('c=>2,d=>3'::hstore);
select * from b;
         h          
--------------------
 "a"=>"1", "b"=>"2"
 "c"=>"2", "d"=>"3"
(2 rows)

$ cat > /tmp/t.tsv
a=>1,b=>2
c=>2,d=>3
^d

copy b(h) from '/tmp/t.tsv';
select * from b;
         h          
--------------------
 "a"=>"1", "b"=>"2"
 "c"=>"2", "d"=>"3"
 "a"=>"1", "b"=>"2"
 "c"=>"2", "d"=>"3"
(4 rows)
于 2012-03-19T15:16:08.687 に答える